在C

时间:2016-09-22 21:34:49

标签: c

我是代码中的新手,我正在使用K& R进行C编码,但我有一些简单的问题使我复杂化,我知道这可能是一个非常愚蠢的问题但是我又是新的如果你能以一种菜鸟能够理解的方式解释我,我会很感激。

只想在srev []中存储“4321”,但它只是不打印任何东西,我知道还有其他方法来反转字符串,但我想知道为什么这个不起作用,谢谢。< / p>

#include <stdio.h>

#define MAXL 1000

char s[MAXL] = "1234"; 
char srev[MAXL]; 

main(){

    int i =0;                   
    for(i=0; 4>=i; ++i){  
        srev[i] = s[4-i];
    }

    printf("srev[]: %s", srev);
}

3 个答案:

答案 0 :(得分:5)

扩展Dunno的评论:C中的字符串"1234"长度为五个字节。第五个字节s[4]是一个零字节,表示字符串终止。

您的代码将该零字节复制到srev[0],因此现在您的C字符串在它开始之前就会终止。

i<4循环中使用for(并相应地将算术调整为3-i),以便只交换非零字节。然后显式设置srev[4] = '\0';以在正确的位置终止新字符串。

答案 1 :(得分:2)

for循环中,您要做的最后一件事就是将s[4]放入srev[0]。该元素(第五个因为数组为零索引)是字符串null终止符。这意味着srev中的第一件事告诉printf停止打印 将你的循环改为:

for(i=0; 3>=i; ++i){  
    srev[i] = s[3-i];
}

或:

for(i=0; 4 > i; ++i){  
    srev[i] = s[3-i];
}

答案 2 :(得分:0)

因为[4] =&#39; \ 0&#39;这意味着字符串的结尾。如果你将null终结符分配给一个字符串就意味着你告诉它:&#34;它结束了,不再接受字符&#34;:

#include <stdio.h>

#define MAXL 1000

char s[MAXL] = "1234"; 
char srev[MAXL]; 

main(){

    int i = 0;                   
    for(i=0; 4 > i; ++i){  
        srev[i] = s[3-i];  // 3 - 0 = 3 so s[3] = '4' s4 = '\0'
    }

    printf("srev[]: %s", srev);
    printf("\n\n");
}