如何解决将 strlen(s) 值分配给整数会改变输出,为什么?
char s[100];
cin>>s;
int x=strlen(s);
if((x-2)>=9)
cout<<s[0]<<x-2<<s[x-1]<<endl;
else
cout<<s<<endl;
输入'a'的输出是'a'但是
char s[100];
cin>>s;
if((strlen(s)-2)>=9)
cout<<s[0]<<strlen(s)-2<<s[strlen(s)-1]<<endl;
else
cout<<s<<endl;
这个程序对于相同输入 'a' 的输出是 a18446744073709551615a。
仅将 strlen(s) 值分配给整数就可以避免问题的发生。为什么??
18446744073709551615a 的垃圾值从何而来,如果在第二种情况下编译“if”条件,那么为什么?
解决方法
当您输入 a
时,strlen
将返回 unsigned (size_t
) 1
。 1 - 2
不会是 -1
,而是环绕在 0 处,并为您提供一个非常 大的无符号整数(在您的情况下为 18446744073709551615)。
strlen
返回 size_t
- 无符号 类型。
根据integral conversion规则,strlen(s)-2
的类型保持无符号,对于任何小于2的strlen(s)
都会溢出,环绕并给出一个很大的正值(264 -1 在你的例子中)。
当您第一次将 strlen(s)
分配给 int
变量时,该值将转换为类型 int
,1-2
的结果变为 -1
。您可以通过将 strlen(s)
转换为 int
来实现相同的效果:
if ((static_cast<int>(strlen(s))) - 2) >= 9) ...
或者只是将 -2
移到比较的另一侧:
if (strlen(s) >= 9 + 2) ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。