我正在用C创建一个程序,它接收一个文件并反转每一行:
$ cat file
Line 1
Line 2!
Line_3
$ ./reverse < file
1 eniL
!2 eniL
3_eniL
但是我收到了错误,我不知道为什么。
在程序中,我做了一个循环:
但是,运行该程序,有时复制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中的图像↓↓↓
答案 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);