【问题标题】:Why appear "@" added when copy chars in C为什么在C中复制字符时会出现“@”
【发布时间】:2013-11-24 02:16:51
【问题描述】:

我正在用 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

一些字符串根据长度获得@符号。这里,另一个例子: 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--;
}

Whit 指针:

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 图像↓↓↓

【问题讨论】:

标签: c string char


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多