我对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;
}
有人可以告诉我在哪里可以找到错误吗? 在此先感谢:)
答案 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';
循环后。
还记得释放分配的内存。