为什么在C中复制字符时会添加“@”

时间:2013-11-24 02:16:51

标签: c string char

我正在用C创建一个程序,它接收一个文件并反转每一行:

$ cat file
Line 1
Line 2!
Line_3
$ ./reverse < file
1 eniL
!2 eniL
3_eniL

但是我收到了错误,我不知道为什么。

在程序中,我做了一个循环:

  1. 从stdin读取一行2048个字符串。
  2. 从读取行获取strlen并创建一个新字符串。
  3. 以字符串的相反顺序将char字符串中的字符串复制到新字符串中。
  4. 但是,运行该程序,有时复制char和其他simbols(@)得到这样的东西: http://i.stack.imgur.com/G8VTx.png

    根据长度,某些字符串会获得@ simbols。这是另一个例子: http://i.stack.imgur.com/1UKdL.png

    文件在us-ansii中。 该计划的代码是:

    #include <stdio.h>
    #include <string.h>
    #include <sysexits.h>
    #include <stdbool.h>
    
    int main(int argc, char *argv[]){
        char string[2048];
        bool final = false;
        while(!final){
            fgets(string,2048,stdin);    // Read line
            if(feof(stdin))
                final=true;
            else{
                int length;
                length = (string[strlen(string)-1] == '\n') ? strlen(string)-1 : strlen(string);
                char reverseStr[length];
                // Loop
                int count = length;
                for(int i=0;i<length;i++){
                    reverseStr[i]=string[count-1];
                    count--;
                }
                printf("%s\n",reverseStr);
            }
        }
    
    }
    

    我尝试过更改循环:

    for(int i=0;i<length;i++){
        reverseStr[count-1]=string[i];
        count--;
    }
    

    惠特指针:

    for(int i=0;i<length;i++){
        char * pr = $reverseStr[count-1];
        *pr=string[i];
        count--;
    }
    

    @符号用于出现在同一位置。 “Febrero”获得“orerbeF” “Febrerol”获得“lorerbeF @” “Febreroll”获得“llorerbe @”(失去“F”)

    这里是gdb的图片: 程序正在逆转第二行“Febreroll”

    reverseStr是“llorer”( $ 12

    在下一次迭代中:

    reverseStr是“llorerb”( $ 14

    在下一次迭代中,程序会复制“e”以及更多内容:

    reverseStr是“llorerbe \ 221 \ b @”( $ 16

    GDB中的图像↓↓↓

2 个答案:

答案 0 :(得分:3)

这是因为代码没有注意确保终止时存在NUL字符。 @碰巧出现在最终的(未初始化的)缓冲区中,然后可能是随机的NUL。

要解决此问题,请执行以下操作:

        for(int i=0;i<length;i++){
            reverseStr[i]=string[count-1];
            count--;
        }
        reverseStr[length] = '\000';  // I added this.

答案 1 :(得分:0)

您将长度存储为单独的计数而不是NULL终止符。使用格式字符串中的长度。

printf("%*s\n", length, reverseStr);