【问题标题】:Assigning strlen(s) value to an integer is varying the output, WHY? [duplicate]将 strlen(s) 值分配给整数会改变输出,为什么? [复制]
【发布时间】:2021-10-06 15:36:17
【问题描述】:
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' BUT

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”条件,那么为什么?

【问题讨论】:

    标签: c++ arrays string character strlen


    【解决方案1】:

    当您输入a 时,strlen 将返回 unsigned (size_t) 11 - 2 不会是 -1,而是在 0 处环绕并给你一个 非常 大的无符号整数(在你的情况下为 18446744073709551615)。

    【讨论】:

      【解决方案2】:

      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) ...
      

      【讨论】:

        猜你喜欢
        • 2020-05-07
        • 2015-02-23
        • 2019-02-25
        • 1970-01-01
        • 1970-01-01
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        相关资源
        最近更新 更多