社区
C语言
帖子详情
strlen返回值的问题
Grubby_c
2005-11-10 09:05:56
最近在看《C与指针》对书上169页有个问题想不通
if( strlen(x)) >= 10...
if( strlen(x) - 10 >=0)...
这两句是不同的,strlen返回的是一个无符号类型,
1.在表达式中使用无符号数可能导致不可预料的结果,
2.把strlen强制转换成int可以解决这个问题
3.size_t是什么类型?
以上3点不明白,望指点
...全文
1617
14
打赏
收藏
strlen返回值的问题
最近在看《C与指针》对书上169页有个问题想不通 if( strlen(x)) >= 10... if( strlen(x) - 10 >=0)... 这两句是不同的,strlen返回的是一个无符号类型, 1.在表达式中使用无符号数可能导致不可预料的结果, 2.把strlen强制转换成int可以解决这个问题 3.size_t是什么类型? 以上3点不明白,望指点
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Grubby_c
2005-11-12
打赏
举报
回复
结帖送分
u94586813
2005-11-11
打赏
举报
回复
unsigned int与int运算时,int会自动转换为unsigned int。如果int为负数,当它转换为unsigned int时会是一个很大的正整数。所以说很危险。
若将unsigned int强制转换为int的话,不能说没有问题,我觉得也有可能出问题,但是相对来说还是比较好。
size_t我记得是unsigned int型
屋顶上的老猫
2005-11-11
打赏
举报
回复
1、strlen是用来返回一个字符串的长度!其实,记住这个就够了。字符串存在,则strlen()返回的必定大于零,当初为了更好的约束编译机制,理所当然的就把他定义成一个无符号型了(也就是把最高位锁定为0)
2、(int)strlen(char *);释放最高位,不过一般情况下不这样处理!这违反了基本事实,不过计算机不知道;呵呵
3、size_t 是 unsigned long
liubo1977
2005-11-11
打赏
举报
回复
#include<stdio.h>
int main()
{
unsigned int i;
i=1;
if(i>-1)
{
printf("i>-1\n");
}
if(i<-1)
printf("i<-1\n");
}
打印的结果为i<-1,这验证了:"unsigned 类型的数不要和非unsigned的数比较,因为在比较之前,编译器会把两个数强制类型转换为unsigned的型的"这句话,但是"表达式:a > -1恒为真"这句话是错误的
csucdl
2005-11-11
打赏
举报
回复
ok
3.
在vc下,你用typeid(size_t).name()可以察看size_t 的类型,其实是unsigned int 类型的
2.
看下面的代码就知道为何危险了
for(unsigned i = 4; i >= 0; --i)
...
就会死循环
nodummy
2005-11-11
打赏
举报
回复
你找个Linux的系统,在include的目录里面grep ssize_t *基本上可以找到一大把的ssize_t
我用的是FreeBSD,在/usr/include/machine/_types.h里面有typedef __int32_t __ssize_t;这么一句,然后在unistd.h里面有typedef __ssize_t ssize_t;这么一句,这个可能是POSIX.1定义的类型而不是ISO/IEC 9899-1999定义的类型。但是可以确定,这个是有符号的类型(前面的s代表了signed)。另外,这个是和系统相关的类型,所以FreeBSD引入了一个__ssize_t在machine/_types.h里面,以便跨平台移植。
Grubby_c
2005-11-11
打赏
举报
回复
size_t 是 unsigned long
转int是会有问题的
那该怎么办放弃if( strlen(x)) >= 10这种写法吗?
-----------------------------------------------------
to nodummy
某些实现定义的ssize_t才是有符号的
说说有哪些定义
nodummy
2005-11-11
打赏
举报
回复
楼上恰好搞错
1、a > -1永远是假,而a >= 0才永远是真
2、在IA32上面,0x80000000如果以int来解释应该是-2^31,如果strlen返回这么一个值,被你转换到int的话,没有int值能比他更小了
3、标准里面只要求size_t为可以表示至少65535的无符号类型,65535这个只是SIZE_MAX的底限,其他的并未作更多说明,具体size_t是个什么东西,要看具体的实现
而且,size_t应该是在stddef.h里面被定义的,其他的头文件仅仅是可能定义这个东西而已。
逍遥过客
2005-11-10
打赏
举报
回复
1.在表达式中使用无符号数可能导致不可预料的结果,
如定义:unsigned int a;
那么表达式:a > -1恒为真。如当在循环中进行类似判断时,很容易造成死循环。
unsigned 类型的数不要和非unsigned的数比较,因为在比较之前,编译器会把两个数强制类型转换为unsigned的型的,如果那个非unsigned的数是负的,那么结果不可预料。
2.把strlen强制转换成int可以解决这个问题
如上分析,两个int数比较不会有问题,无论正负如何。
3.size_t是什么类型?
其实就是unsigned int,代表非负整数。
在VC中的stdio.h文件中有如下定义:
#ifndef _SIZE_T_DEFINED
typedef unsigned int size_t;
#define _SIZE_T_DEFINED
#endif
codearts
2005-11-10
打赏
举报
回复
size_t 是unsinged int, 无符号整数,顾名思义,无符号整数不可能小于0的
goodluckyxl
2005-11-10
打赏
举报
回复
size_t 是 unsigned long
转int是会有问题的
nodummy
2005-11-10
打赏
举报
回复
这个是在胡扯……
标准里面说了size_t是无符号的类型,由sizeof操作符返回,某些实现定义的ssize_t才是有符号的。
混合有符号的数和无符号的数是一个很大的忌讳,但是从size_t转换到int绝对不是一个好方法
sankt
2005-11-10
打赏
举报
回复
size_t 是 unsigned long 型
边学边用边创造
2005-11-10
打赏
举报
回复
sizt_t 就是int
php判断输入是否是纯数字,英文,汉字的方法
本文实例讲述了php判断输入是否是纯数字,英文,汉字的方法。分享给大家供大家参考。具体分析如下: 这里利用php的mb_
strlen
和
strlen
函数就可以轻松得知字符串的构成是全英文、英汉混合、还是纯汉字。简要说明如下: 1、如果
strlen
返回的字符长度和mb_
strlen
以当前编码计算的长度一 致,可以判断是纯英文字符串。 2、如果
strlen
返回的字符长度和mb_
strlen
以当前编码计算的长度不一致, 且
strlen
返回值
同mb_
strlen
的
返回值
求余后得0可以判断为是全汉字的字符串。 3、如果
strlen
返回的字符长度和mb_
strlen
以当前编码计算的长度不一致, 且strle
C语言 用指针作为函数
返回值
详解
C语言允许函数的
返回值
是一个指针(地址),我们将这样的函数称为指针函数。下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include #include char *strlong(char *str1, char *str2){ if(
strlen
(str1) >=
strlen
(str2)){ return str1; }else{ return str2; } } int main(){ char str1[30], str2[30], *str; gets(str1);
C语言学习-字符串处理函数
C语言学习-字符串处理函数 strcat(char str1,char str2) strcpy(char str1,char str2) strncpy(char str1,char str2,int n) strcmp(char str1,char str2)//比较两个字符串大小str1>str2
返回值
>0,str1=str2
返回值
=0,str1
返回值<0
strlen
(char str)//返回字符串数据长度 strlwr(char str)//转换为小写 strupr(char str)//转换为大写
c语言字符串处理函数.pdf
c语言字符串处理函数.pdf
C语言
strlen
返回值
问题
strlen
函数原型如下 size_t
strlen
(const char *s); size_t 是一个无符号整型数据,在进行大小比较的时候可能会出错 以下例子中 if (-1 <
strlen
(myStr)) { printf(" -1 <
strlen
(myStr)\n"); } else { printf("-1 >
strlen
(myStr)\n"); } 这里的输出结果是第二个,原因如下 在进行比较的时候,由于
strlen
返回的是无符号整形数据,C语言首先会把-1转化为
C语言
70,008
社区成员
243,256
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章