【问题标题】:strlen function giving wrong valuestrlen 函数给出错误的值
【发布时间】:2011-10-10 08:22:42
【问题描述】:

大家好,我写过代码

char sentence[100]; 
scanf("%s" ,sentence); 
char * ptrs = sentence ;
printf("%d", strlen(ptrs));

假设我输入

john is a boy

strlen() 函数给我值 4 它在空格后停止计数我应该做什么 谢谢

【问题讨论】:

  • 提示:当你不明白 strlen() 在做什么时,尝试打印你传递给它的值:printf("<<%s>>\n", ptrs);。这将立即表明问题所在。该技术一般适用于任何调试问题。要么使用调试器查看传递给函数的内容,要么使用打印语句。

标签: c arrays strlen


【解决方案1】:

scanf 只会读取一个单词,如果你执行printf 你会看到它。所以strlen没有错。

使用fgets 读取整行:

if (! fgets(sentence, sizeof(sentence), stdin)) {
   fprintf(stderr, "error or end  of file while no characters have been read\n");
   return;
}

【讨论】:

    【解决方案2】:
    scanf("%s" ,sentence);
    

    这只会读取一个字符串直到下一个空格。这意味着不会读取剩余的字符,因此不会读取 john 之后的单词。

    要获得所需的输出,请改用gets()。

    gets(sentence);
    

    【讨论】:

    • 不要使用gets();使用fgets()
    • 是由于gets()产生危险的副作用,例如允许访问敏感的内存区域。我的意思是,我记得看到警告,“使用 gets() 是危险的”。
    • 来自手册页:永远不要使用gets()。因为在事先不知道数据的情况下不可能知道gets()会读取多少个字符,并且因为gets()会继续存储超过缓冲区末尾的字符,所以使用起来非常危险。它已被用来破坏计算机安全。请改用 fgets()。
    • 那是因为没有办法安全使用它。它不知道缓冲区有多大;它会覆盖你的缓冲区。忘记曾经存在过的gets()总是使用fgets() 或等效的(getline() 等),它们要么采用一定大小以防止缓冲区溢出,要么扩展内存以满足输入行的要求。跨度>
    【解决方案3】:

    fgets() 而不是 scanf()。
    scanf() 将输入带到单词的末尾。

    调试提示:

    您应该能够在某种程度上自己进行调试。当 strlen() 没有给出正确答案时,首先要做的是验证您的假设。您假设句子/ptrs 具有正确的值。一个简单的 printf 就证明它是错误的。

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多