简单字符串反向算法

时间:2016-06-28 10:41:14

标签: c string algorithm reverse

我对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;

}

有人可以告诉我在哪里可以找到错误吗? 在此先感谢:)

3 个答案:

答案 0 :(得分:1)

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

请注意,strlen返回的字符串长度没有最终0,因此字符串foo包含strlen(foo)+1个字符。在分配字符串时请记住这一点。

答案 1 :(得分:0)

你忘了为终止&#39; \ 0&#39;分配一个字符。在nstr []。

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

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

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

答案 2 :(得分:0)

正如其他答案所提到的,你错过了终结者。 还应该注意,以你的方式分配字符串是不好的做法。如果以这种方式创建数组,则数组应始终具有固定大小。

你应该这样做:

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

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

当你调用printf(,string)时; ,它将从第一个字母开始,并将所有内容打印到终结器。由于此处没有终结符,因此会打印随机字符,例如@。

你想要解决的问题是:

nstr[i] = '\0';  
循环后

还记得释放分配的内存。