社区
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点不明白,望指点
...全文
1636
14
打赏
收藏
strlen返回值的问题
最近在看《C与指针》对书上169页有个问题想不通 if( strlen(x)) >= 10... if( strlen(x) - 10 >=0)... 这两句是不同的,strlen返回的是一个无符号类型, 1.在表达式中使用无符号数可能导致不可预料的结果, 2.把strlen强制转换成int可以解决这个问题 3.size_t是什么类型? 以上3点不明白,望指点
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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语言
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转化为
strlen
返回值
的漏洞
strlen
是一个统计字符串长度的函数 然后我们这次说的题 就是 关于
strlen
返回值
造成 溢出的
问题
在32的系统中 有这么一种情况
strlen
的结果的
返回值
给8位寄存器al 那么8位最多是多少? 255 如果我们 多输入会怎么办 我们如果输入257 二进制是多少呢 000100000001 这个应该是没有什么好说的 那么假如我们输入了 257个字符 那么最后...
C语言
70,025
社区成员
243,253
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章