在C中反转一个字符串

时间:2014-08-28 09:01:52

标签: c arrays string pointers reverse

#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[]。有人可以请你彻底解释我做错了什么吗?对此,我真的非常感激。

5 个答案:

答案 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);
}