c - 为什么在C中copy chars时出现 "@"added

标签 c string char

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

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

但是我得到一个错误,我不知道为什么。

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

  1. 从标准输入读取一行到 2048 个字符的字符串。
  2. 从读取的行中获取strlen并创建一个新字符串。
  3. 将字符串中的字符一个字符一个字符地以相反的顺序复制到新字符串中。

但是,运行该程序,有时会复制一个字符和其他符号 (@) 得到如下内容: 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图片↓↓↓

最佳答案

发生这种情况是因为代码没有注意确保终止处有 NUL 字符。 @ 恰好出现在末尾的(未初始化的)缓冲区中,然后大概是一个随机的 NUL。

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

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

关于c - 为什么在C中copy chars时出现 "@"added,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20170316/

相关文章:

c - 将字符串传递给函数的存储位置

Javascript Foreach 的日期格式打印相同的日期

使用字典和字符串的 Python 字符串插值

C++ 将字节从 char* 传递到 BYTE*

c - C 和 Linux 中的单一实例应用程序

c - 一种方法会引发段错误,而另一种则不会。有什么不同?

c - 如何在标题中不包含标题的情况下处理 typedef

python - 区分大小写的列表排序,但只是重复的值?

c - 如何调试这段c代码

c - c中的空字符