简单字符串反转算法的意外结果

unexpected results on simple string reverse algorithm

我是 C 语言的新手。我想通过解决 coderbyte challenges 来学习这门语言。

但我一开始就卡住了。它应该是一个简单的字符串反向算法。

当我输入 "asdf" 或“1234567”之类的内容时,输出是正确的("fdsa"、“7654321”)。但是,当我输入“12345678”或 "thisiscool" 时,结果是“87654321▒@”/"loocsisiht@"。我不知道@来自哪里。

这是我的代码:

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

void FirstReverse(char str[]) {

  int len = strlen(str);
  char nstr[len];
  int i;

  for(i = 0; i < len; i++) {
      nstr[i] = *(str+len-1-i);
  }

  printf("%s\n", nstr);

}
int main(void) {

  char str[100];

  FirstReverse(gets(str));
  return 0;

}

谁能告诉我在哪里可以找到错误? 提前致谢:)

您忘记为 nstr[] 中的终止 '\0' 分配一个字符。

所以,最好使用:char nstr[len + 1]; 并设置 nstr[len] = 0;

此外:gets() 是邪恶的:来自 glibc 手册页:

永远不要使用 gets()。因为在事先不知道数据的情况下无法判断 gets() 将读取多少个字符,并且因为 gets() 将继续存储超过缓冲区末尾的字符,所以使用它是极其危险的。它已被用来破坏计算机安全。请改用 fgets()。

在 C 中,字符串以零结尾。例如字符串"cat",有4个字符,表示为('c','a','t',(char)0)。你忘了最后的 0.

注意,strlen returns 字符串长度没有最后的 0,所以字符串 foo 包含 strlen(foo)+1 个字符。分配字符串时请记住这一点。

正如其他答案所提到的,您缺少一个终结符。 还应该注意的是,按照您的方式分配字符串是不好的做法。如果以这种方式创建数组,则数组应始终具有固定大小。

你应该这样做:

char * nstr = malloc(sizeof(char) * (len+1));

从而分配每个字符的大小(1 字节)乘以长度。 请注意 +1,因为您需要为字符串终止符留出空间。

当你调用 printf(, string); , 它将从第一个字母开始打印所有内容直到终止符。由于这里没有终止符,它会打印随机字符,例如 @.

要解决这个问题,您需要添加:

nstr[i] = '[=11=]';  

循环后。

还要记得释放分配的内存。