在打印结果之前读取整行

时间:2014-02-06 19:44:48

标签: c getchar

好的,首先我是编程的全部业余爱好者,我想尝试一下。我想创建一个C程序,它将读取一行,然后如果字符有效则接受字符打印“ACCEPTED”或“REJECTED”。

所以我使用了while循环和一些if-else if添加可行字符。可行字符是字母',''的字母。 '/''['']'。问题是,在我输入整行后,它会为行上的每个字符打印ACCEPTED和REJECTED。如何让程序先读取整行,然后打印结果?

#include <stdio.h>

int main(void) {
    char c;
    c=getchar();
    while(c!=EOF) {
        while (c!='\n') {
            if (c>='a' && c<='z') {
                printf("OK!\n");
            }
            else if(c==','|| c=='.' ||c=='/') {
                printf("OK!\n");
            }
            else if(c==']'||c=='[') {
                printf("OK!\n");
            }
            else {
                printf("ERROR!\n"); 
            }
            c=getchar();
        }
        c=getchar();    
    }
}

3 个答案:

答案 0 :(得分:2)

抱歉,我的原始答案似乎与您的问题无关。脱脂阅读失败。

感谢您发布代码,在正确回答您的问题时,它会有很大的帮助。

暂时忽略样式,我会以这种方式更改你的代码,只有当你完成解析整行时才会打印OK,这正是@ScottMermelstein所说的,但带有代码。

#include <stdio.h>

int main(void) {
    int c; // This needs to be an int otherwise you won't recognize EOF correctly
    int is_ok;

    c=getchar();
    while(c!=EOF) {
        is_ok = 1; // Let's assume all characters will be correct for each line.
        while (c!='\n') { // So long as we are in this loop we are on a single line
            if (c>='a' && c<='z') {
                // Do nothing (leave for clarity for now)
            }
            else if(c==','|| c=='.' ||c=='/') {
                // Do nothing (leave for clarity for now)
            }
            else if(c==']'||c=='[') {
                // Do nothing (leave for clarity for now)
            }
            else {
            is_ok = 0; // Set is_ok to false and get out of the loop
                break;
            }
            c=getchar();
        }

        if (is_ok) // Only print our result after we finished processing the line.
        {
            printf("OK!\n");
        } else 
        {
            printf("ERROR!\n");
        }

        c=getchar();    
    }

    return 0; // If you declare main to return int, you should return an int...
}

但是,我建议您稍微模块化一下代码。这将伴随着时间和实践,但如果你在适当命名的函数中隐藏东西,你可以用更容易理解的方式编写东西。

#include <stdio.h>

int is_valid_char(int c)
{
    return (isalpha(c) || c == ',' || c == '.' || c == '/' || c == '[' || c == ']');
}

int main(void) {
    int c;
    int is_valid_line;

    c=getchar();
    while(c!=EOF) {
        is_valid_line = 1;

        while (c!='\n') {
            if (!is_valid_char(c)) {
                is_valid_line = 0; // Set is_valid_line to false on first invalid char
                break;             // and get out of the loop
            }
            c=getchar();
        }

        if (is_valid_line) // Only print our result after we finished processing the line.
        {
            printf("OK!\n");
        } else 
        {
            printf("ERROR!\n");
        }

        c=getchar();    
    }

    return 0;
}

答案 1 :(得分:0)

您可以使用scanf并在格式说明符%c前加一个空格来忽略空格。

char ch;
scanf(" %c", &ch);

答案 2 :(得分:0)

这可能就是你要找的东西?

读取一行并处理好/坏字符并打印OK或Error。

#include <stdio.h>

int main ( void  )
{
char buff[1000];
char *p = buff ;
char c ;
int  flgError= 0 ; // Assume no errors
gets( buff ) ;
printf("You entered '%s'\n", buff );
while ( *p  )  // use pointer to scan through each char of line entered
   {
   c=*p++ ;    // get char and point to next one
   if (  // Your OK conditions
        (c>='a' && c<='z')
        || (c>='A' && c<='Z')     // probably want upper case letter to be OK
        || (c==','|| c=='.' ||c=='/')
        || (c==']'||c=='[')
        || (c=='\n' )         // assume linefeed OK
        )
        {
        // nothing to do since these are OK
        }
    else
        {
printf ("bad char=%c\n",c);
        flgError = 1;  // 1 or more bad chars
        }
   }

if ( flgError )
   printf ( "Error\n" );
else
   printf ( "OK\n" );
}