【问题标题】:Why is this snippet giving 6 as output? [duplicate]为什么这个片段给出 6 作为输出? [复制]
【发布时间】:2017-05-23 10:57:50
【问题描述】:
 int main(){    
       char s[1000];    
       s[0]='Q';    
       printf("%d",strlen(s));    
       return 0;    
    }

上面的代码给出了 6 作为输出。 在这种情况下,输出应该是 1。

int main(){    
       char s[1000];     
       printf("%d",strlen(s));    
       return 0;    
}

这段代码甚至给出了 6 作为输出。 它应该是 1000 或 0 或一些垃圾值。 我在 "hackerrank" 中尝试过,但它给出的长度为 6。 当在 TURBOC 中尝试相同的代码时,它给出了正确的答案。 我无法找到此输出的原因。有人可以整理一下并给出这个问题的确切解决方案。

【问题讨论】:

  • 您是否将\0 附加到字符串末尾?
  • 您应该查找有关 strlen() 的文档。男人strlen。
  • '6' 是垃圾值:)

标签: c


【解决方案1】:

本地非静态变量,如您的数组,不会被初始化。它的值或内容将是不确定的

这意味着您的数组包含您想要的字符串终止符的可能性接近于零。

在没有初始化的情况下将数组传递给字符串函数会导致未定义的行为

您需要显式初始化您的数组,例如

char s[1000] = "";

【讨论】:

  • 你也可以使用char s[1000] = {0};来填充'\0's。
  • @InternetAussie 我的初始化和你的一样。
  • 哦,真的。哎呀。仍然是另一种选择:p
【解决方案2】:

行:

char s[1000];  

声明了一个包含 1000 个字符的数组,但它没有在其中放入任何内容。因为它是一个局部变量,所以它被分配在堆栈上,除了保留必要的空间来保存 1000 chars 之外,编译器不会生成任何代码来设置它们的内容(为零或其他值)。

所有 1000 个值都是垃圾。恰好它们中的第 7th 个为零。 strlen() 到达时停止计数并返回 6 但这个值也是垃圾。它可能是230790345 或其他东西。它还可能产生无限循环、分段错误或让你像龙一样吐火。在这种情况下,任何事情都是可能的,并且是语言所允许的。它被称为Undefined Behaviour

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多