【发布时间】:2016-02-20 01:16:49
【问题描述】:
我在 Code::Blocks 中编写了以下代码作为对 K&R C 练习 1-18 的响应:
编写一个程序,从每行删除尾随的空格和制表符 输入,并删除完全空白行。
我的意思是删除空格和制表符(我还没有处理空行部分)。 while 循环正确地将输入保存到字符数组 ip,但是,其余代码似乎无法正常工作,因为 EOF 根本没有非法 任何 输出。
#include <stdio.h>
#define MAXLINE 1000
main(){
int c, z;
char ip[MAXLINE];
z = 0;
while ((c = getchar()) != EOF) {
ip[z] = c;
++z;
}
for (z = 0; ip[z] == ' ' || ip[z] == '\t'; ip[z] = ip[z + 1]);
printf("%s", ip);
}
我试图利用这个问题来学习调试器,但在第 14 行添加断点后,打开监视窗口,然后按开始箭头,没有任何反应。在我的断点处没有出现黄色箭头,我的步骤选项是灰色的,我的变量名和它们的值都没有显示在监视窗口中。
非常感谢有关修复我的代码的建议,但我真正想知道的是我在做什么或不做什么会阻止调试器帮助我。
【问题讨论】:
-
你有没有在
stdin上提供任何意见? -
提示:如果您一次只访问一行输入而不是整个文件,这将容易得多。你的第二个循环完全是假的;除非输入的第一个字符是空格或制表符,否则根本不会触发。
-
您将需要两个索引变量来打乱数组。一个用于源,一个用于目标。考虑一下如果您有多个空格或制表符会发生什么。偏移量 1 将不起作用。并且:请不要尝试将
for循环的工作主体放入其条件中——糟糕的风格。最后别忘了写一个新的字符串终止符'\0' -
您没有在
for (z = 0;...中增加z,当您重置z=0时,您会丢失字符数,并且如果文件大于1000字符,则您正在写入超出末尾while ((c = getchar()) != EOF)中的数组,因为您正在将整个文件读入ip。 -
本书第 29 页有一个
getline函数。我将从它开始。将整行放在内存中可以让您从行尾开始搜索第一个非空白字符。
标签: c arrays debugging codeblocks kernighan-and-ritchie