我正在用 C 创建一个程序,它接收一个文件并像这样反转每一行:
$ cat file
Line 1
Line 2!
Line_3
$ ./reverse < file
1 eniL
!2 eniL
3_eniL
但是我得到一个错误,我不知道为什么。
在程序中,我做了一个循环:
- 从标准输入读取一行到 2048 个字符的字符串。
- 从读取的行中获取strlen并创建一个新字符串。
- 将字符串中的字符一个字符一个字符地以相反的顺序复制到新字符串中。
但是,运行该程序,有时会复制一个字符和其他符号 (@) 得到如下内容: 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/