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 打赏 收藏 转发到动态 举报
写回复
用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 型
  • 打赏
  • 举报
回复
sizt_t 就是int

70,008

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧