反转弦的概念错误。知道其他逻辑,但想知道我哪里出错了

时间:2014-01-22 14:20:04

标签: c string

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void main() {
    int i, j, k=0;
    int len;
    char *rev[3];
    char *s[]={
        "To err is human...",
        "But to really mess things up...",
        "One needs to know c!!"
    };
    for (i=0; i<3; i++) {
        len=strlen(s[i]);
        rev[i]=malloc(strlen(s[i])+1);
        for (j=len-1; j>=0; j--) {
            rev[i][k]=s[i][j];
            k++;    
        }
        rev[i][k]='\0';    
    }
    for (i=0; i<3; i++)
        printf("%s\n", rev[i]);
}

这个程序编译好但不运行。任何人都可以指出逻辑错误或概念吗?我试图在这里扭转字符串......

2 个答案:

答案 0 :(得分:2)

问题似乎是您不会为每个字符串重置k0(仅在程序开头)。因此,您应该在内部k = 0;循环之前for

答案 1 :(得分:0)

虽然你已经得到了使代码有效的答案,但我建议你做一些不同的事情。我将代码移动到将一个字符串转换为单独的函数:

char *reverse(char const *in) {
    char *ret;
    int j, k=0;
    size_t len=strlen(in);
    ret=malloc(len+1);
    for (j=len-1; j>=0; j--) {
        ret[k]=in[j];
        k++;
    }
    ret[k]='\0';
    return ret;
}

然后我会从main调用它来根据需要反转字符串:

for (i=0; i<3; i++) 
    rev[i]=reverse(s[i]);

另请注意,rev中的字符串已分配malloc,因此当您不再需要它们时,您应该释放它们:

for (i=0; i<3; i++) {
    printf("%s\n", rev[i]);
    free(rev[i]);
}