Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“为什么出现?”@&引用;在C中复制字符时添加_C_String_Char - Fatal编程技术网

“为什么出现?”@&引用;在C中复制字符时添加

“为什么出现?”@&引用;在C中复制字符时添加,c,string,char,C,String,Char,我正在用C语言创建一个程序,它接收一个文件并反转每一行,如下所示: $ cat file Line 1 Line 2! Line_3 $ ./reverse < file 1 eniL !2 eniL 3_eniL $cat文件 第1行 第二行! 第3行 $/反向

我正在用C语言创建一个程序,它接收一个文件并反转每一行,如下所示:

$ cat file
Line 1
Line 2!
Line_3
$ ./reverse < file
1 eniL
!2 eniL
3_eniL
$cat文件
第1行
第二行!
第3行
$/反向<文件
1埃尼尔
!2埃尼尔
3_eniL
但是我犯了一个错误,我不知道为什么

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

  • 从stdin读取一行到2048个字符的字符串
  • 从读取行获取strlen并生成一个新字符串
  • 将字符串中的字符按相反顺序逐字符复制到新字符串中
  • 但是,在运行程序时,有时会复制一个char和其他simbol(@),得到如下结果:

    一些字符串根据长度获得@simbols。这里是另一个例子:

    档案在美国安西。 程序代码为:

    #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);
            }
        }
    
    }
    
    #包括
    #包括
    #包括
    #包括
    int main(int argc,char*argv[]){
    字符字符串[2048];
    bool-final=false;
    而(!最终){
    fgets(string,2048,stdin);//读取行
    if(feof(stdin))
    最终=正确;
    否则{
    整数长度;
    长度=(字符串[strlen(字符串)-1]=='\n')?strlen(字符串)-1:strlen(字符串);
    char reverseStr[长度];
    //环路
    int计数=长度;
    
    对于(int i=0;i),发生这种情况是因为代码没有注意确保在终止处有NUL字符。@恰好出现在结尾处的(未初始化)缓冲区中,然后可能是一个随机NUL

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

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

    for(int i=0;i将长度存储为单独的计数,而不是NUL终止符。因此,请使用格式字符串中的长度

    printf("%*s\n", length, reverseStr);
    
    GDB映像:
            for(int i=0;i<length;i++){
                reverseStr[i]=string[count-1];
                count--;
            }
            reverseStr[length] = '\000';  // I added this.
    
    printf("%*s\n", length, reverseStr);