#include <stdio.h>
void reverse(int len, char s[], char b[]);
int main() {
char s[5] = "hello";
char b[5];
reverse(5, s, b);
return 0;
}
void reverse(int len, char s[], char b[]) {
int i;
for (i = 0; i < len; i++) {
b[(len - 1) - i] = s[i];
}
printf("%s : %s\n", s, b);
printf("%s", b);
}
以上是C
中的上述代码。当我运行它时,它会将字符串s[]
切换为b[]
,但b[]
也包含s[]
。有人可以请你彻底解释我做错了什么吗?对此,我真的非常感激。
答案 0 :(得分:8)
char s[5] = "hello";
这是错误的,您还需要一个[6]
来存储尾随'\0'
(b
相同)
最好省略数组大小:
char s[] = "hello";
char b[sizeof(s)];
b[i] = '\0';
循环后你需要for
。
答案 1 :(得分:3)
您的字符串缓冲区太小,它们必须是六个字符或更多才能保存字符串"hello"
。请记住,字符串C在结尾处有一个终止'\0'
字符;这个空间只适合五个角色。
此外,在倒车时,您永远不要复制终止字符。
退出b[len - 1] = '\0';
之前需要reverse()
。
将未结束的字符串传递给printf()
"%s
&#34;格式,你得到未定义的行为。通常情况下它会跑到最后#34;字符串,打印在内存中发现的任何内容,直到找到值为0的字符,导致它停止。
答案 2 :(得分:0)
%s格式说明符需要一个字符串:以nul字节结尾的字符数组。你没有提供,所以你得到了垃圾结果。要保存包含五个字符的字符串,您至少需要六个字符。
答案 3 :(得分:0)
c中的每个字符串都以\0
结尾,这是一个空字符。所以数组大小应足以容纳字符串和空字符。
我建议增加数组的大小。
important :-
在最后一次分配b [last_index] ='\ 0'; 这样字符串b就可以被\ 0终止。否则它可能会在打印字符串b时给出垃圾值和实际数据。
答案 4 :(得分:0)
在C中,您只需要包含
#include<string.h>
并使用
strrev(a);
其中a是字符数组或字符串。
然而,您的代码也可以被修改,以便像这样编写
#include <stdio.h>
void reverse(int len, char s[], char b[]);
int main() {
char s[5] = "hello";
char b[5];
reverse(5, s, b);
return 0;
}
void reverse(int len, char s[], char b[]) {
int i,j;
for (i = 0,j=len-1; i <=j; i++, j--) {
b[j]=a[i];
}
printf("%s : %s\n", s, b);
printf("%s", b);
}