简单字符串反转算法的意外结果
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=]';
循环后。
还要记得释放分配的内存。
我是 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=]';
循环后。
还要记得释放分配的内存。