将 strlen(s) 值分配给整数会改变输出,为什么?
Assigning strlen(s) value to an integer is varying the output, WHY?
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
将 return unsigned (size_t
) 1
。 1 - 2
不会是 -1
而是在 0 处回绕并给你一个 非常 大无符号整数(在你的例子中是 18446744073709551615)。
strlen
returns size_t
- unsigned 类型。
根据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) ...
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
将 return unsigned (size_t
) 1
。 1 - 2
不会是 -1
而是在 0 处回绕并给你一个 非常 大无符号整数(在你的例子中是 18446744073709551615)。
strlen
returns size_t
- unsigned 类型。
根据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) ...