【问题标题】:strlen returns wrong value after for loop [duplicate]strlen 在 for 循环后返回错误值 [重复]
【发布时间】:2021-10-12 22:28:39
【问题描述】:

如果需要,您可以在此处运行以下示例代码:

Online C compiler

#include <stdio.h>
#include <string.h>

void foo(char *name);
char bar(char c);
 

int main(int argc, char **argv)
{
    foo("Ashcroft");
    return 0;
}

void foo(char *name)
{
    printf("name = %s\n", name);
    int name_length = strlen(name);
    char code[name_length];
    printf("length of name %d\n", name_length);

    for (int i = 0; i < name_length; i++)
    {
        code[i] = bar(name[i]);
    }
    printf("length of code is %ld\n", strlen(code));

    printf("name is %s\n", name);
}

char bar(char c)
{
    return 'a';
}

问题

我希望length of codelength of name 相同, 但不知何故,在 for 循环之后长度会发生变化。

输出

name = Ashcroft
length of name 8
length of code is 14
name is Ashcroft

更新 试过char code[name_length+1];,结果还是一样

【问题讨论】:

标签: c


【解决方案1】:

您声明 code 的长度刚好足以容纳 name 中字符串的一部分字符,但不足以容纳字符串结尾的终止空字节。

因此,当您将code 传递给strlenprintf 时,它们会读取数组末尾以寻找终止的空字节。读取数组的末尾会触发undefined behavior,在这种情况下会表现为字符串的意外长度。

您需要将code 增加一个元素来保存终止的空字节:

char code[name_length+1];

并且还在构建字符串后添加空字节:

int i;
for (i = 0; i < name_length; i++)
{
    code[i] = bar(name[i]);
}
code[i] = 0;

【讨论】:

  • 仅仅使code足够大是不够的。还需要编写空终止符(可能通过迭代到i &lt; name_length + 1)。
  • @0___________ 很好。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
相关资源
最近更新 更多