【发布时间】:2013-11-24 02:16:51
【问题描述】:
我正在用 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
一些字符串根据长度获得@符号。这里,另一个例子: 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 图像↓↓↓
【问题讨论】:
-
GDB 镜像:i.stack.imgur.com/Hlh8r.png