2016-06-28 40 views
0

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

'strlen'返回没有* nul终止的长度*,所以'nstr'太小。你也不要指定nul终止。 – user694733

回答

0

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

而应该做的:

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

从而分配每个字符(1个字节)倍lenght的大小。 请注意+1,因为您需要字符串终结符的空间。

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

你怎么会想做些什么来解决这个问题,是增加:

nstr[i] = '\0'; 

你的循环之后。

还记得释放分配的内存。

0

你忘了在nstr []中为终止'\ 0'分配一个字符。

所以,更好的利用:char nstr[len + 1];并设置nstr[len] = 0;

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

不要使用gets()函数。因为事先不知道数据是不可能知道get()将读取多少个字符的,并且因为gets()会继续存储超过缓冲区末尾的字符,所以使用它非常危险。它已被用来破坏计算机安全。使用fgets()代替。

1

在C中,字符串是零终止的。例如,一个字符串“cat”有4个字符,表示为('c','a','t',(char)0)。你忘了最终0

注意strlen返回没有最终0字符串长度,所以字符串foo包含strlen(foo)+1字符。记住这一点,当你分配字符串。