循环在C中结束时如何执行指令

时间:2018-10-03 17:53:53

标签: c loops for-loop while-loop

如何实现该指令

#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}}

2 个答案:

答案 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}}也不想打印,对吗?我将把这部分留给您以进行适当的实施。

希望它有帮助,祝你好运。