如何实现该指令
#include <stdio.h>
int main()
{
int a;
while (a != EOF)
{
a=getchar();
while (a==" " || a=="\t")
a=EOF;
/*I want to put printf(" "); here */
putchar(a);
}
return 0;
}
被触发然后循环结束?我必须为我的课程编写一个程序,用一个空格替换所有制表符和空格。
{{1}}
答案 0 :(得分:3)
您的程序不正确有多种原因:
a
在您第一次与EOF
比较时是统一的,因此行为是不确定的。a
与字符串" "
。将a
与带有单引号的字符常量进行比较:a == ' '
。这是另一种方法:一次读取一个字符,如果它是一个空格,则设置一个空格指示符,如果设置了指示器,则不输出字符前面的空格并重置指示器。
这里是一个例子:
#include <stdio.h>
int main() {
int c;
int insert_space = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t') {
insert_space = 1;
} else {
if (insert_space) {
putchar(' ');
insert_space = 0;
}
putchar(c);
}
}
if (insert_space) {
/* there are spaces and/or tabs at the end of the last line
* of the file, which is not newline terminated. It might be
* a good idea to remove these completely.
*/
putchar(' ');
}
return 0;
}
以自己的源代码作为输入运行时,输出为:
#include <stdio.h>
int main() {
int c;
int insert_space = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t') {
insert_space = 1;
} else {
if (insert_space) {
putchar(' ');
insert_space = 0;
}
putchar(c);
}
}
if (insert_space) {
/* there are spaces and/or tabs at the end of the last line
* of the file, which is not newline terminated. It might be
* a good idea to remove these completely.
*/
putchar(' ');
}
return 0;
}
答案 1 :(得分:1)
关于您的问题,我认为您发布的代码不会编译或maby会编译,但会发出警告。
我们来看一下:
int a;
while (a != EOF)
此处您未初始化就访问a
,这可能会导致程序的行为无法预测,您最好编写类似以下内容的
int a = getchar();
while (a != EOF)
下一步:
while (a==" " || a=="\t")
a
的类型为int
,而""
表示C中的空终止字符串,并被视为存储该字符串的内存的 pointer 。比较字符与指针不是一个好主意:)。您的意思是将a
与空格或制表符作为单个字符进行比较。这应该通过''
完成:
while (a==' ' || a=='\t')
现在我们得到了
while (a==' ' || a=='\t')
a=EOF;
只要a
制表符或空格,就会执行此循环,但是循环体内有什么? a = EOF;
,因此流程将在下一次迭代时立即退出while循环。
我想您的意思是读取输入并向前跳过,只要输入是空格或制表符,那么您可能必须通过getchar()
while (a==' ' || a=='\t')
a = getchar();
但是请不要忘记getchar()
可能会在输入结束或出现错误时返回EOF
,并且您不想在发生这种情况时卡在while循环中:
while ((a != EOF) && (a==' ' || a=='\t'))
a = getchar();
现在,当退出此while
循环时(与当前代码不同),在打印a
之前,您需要检查之前是否有空格或制表符,然后在打印值之前先打印一个制表符在a
中。如何(?),根据您的原始问题,有两个选项:printf(" ");
或putchar(' ');
,选择最喜欢的内容。另外,如果包含a
的{{1}}也不想打印,对吗?我将把这部分留给您以进行适当的实施。
希望它有帮助,祝你好运。