循环只用指针赋值执行一次

时间:2016-09-19 01:12:48

标签: c

我有一个简单的代码来反转字符串:

char* reverse(char* s){    
int i,j,len=strlen(s);
char* r;


for(i=len-1,j=0;i>=0;i--,j++){
    printf("%d:%c\n",j,s[i]);
    r[j]=s[i];
}

假设输入字符串是" abc" ,然后输出"没有"内部循环中的r[j]=s[i];行是:

0:c
1:b
2:a

如果我包含r[j]=s[i]分配,则输出会停止!

0:c

为什么作业会在这里停止循环?

2 个答案:

答案 0 :(得分:2)

首先,您要写入未初始化的指针:声明char * r,但从未分配。动态地或在堆栈上分配内存,然后写入内存。 例如:

char* r = malloc(len + 1);

现在,当您尝试访问未初始化的内存时,您的代码很可能会崩溃。

答案 1 :(得分:1)

有些事情导致问题......

j被赋值为零,并在for循环中与零进行比较,这将立即满足循环的条件,并将退出。

另请注意,由于数组包含0作为第一个元素,因此字符串长度将报告为比实际大小小1,因此大小总是比数组中的大小少一个。

我建议将j拉出for循环分配并在循环体内增加它。它将更容易调试,您可以观察它的价值并逐步完成代码。

// an example of how to assign the input value for a
// function accepting an array of characters instead of a pointer
char s[] ="hellodude";

// start of the function which accepts an array of char
// (may need adjusting to return a buffer and pointer
// etc. you can determine that)
char* reverse(char s[]){
    // note the following changes to fix the iterating problems...
    int i,j=0,len=strlen(s)+1;
    char r[len];

    for(i=len-1,i>=0;i--;){
        j++;
        printf("%d:%c\n",j,s[i]);
        r[j]=s[i];
    }
return r;
}

希望这能指出你正确的方向。