不退出c中的循环

时间:2013-11-20 18:19:53

标签: c

我希望问题按顺序识别单词:XYZ1111***无论多少'1'或'*',但它必须至少有一个'1',XYZ必须按照确切的顺序始终包含在字符串中有效。它必须从我写过很多这些单词的文件中读取,例如XYZ1XYZ1111*1111*,如果单词符合限制,则打印ok。当我运行我的程序时,它只需要文件的名称,然后什么也不做。这是我的代码:

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[]) {

    FILE *input;
    char c;

    if(argc >2) {
        printf("Too much arguments");
        exit(1);
    } else if(argc==2) {
        input=fopen(argv[1],"r");
        if(input==NULL) {
            printf("Unable to find file ");
            exit(1);
        }
    } else {
        input=stdin;
        c=fgetc(input);
        while (!feof(input)) {
            if (c=='x') {
                int state=1;
                while(1) {
                    switch(state) {
                        case 1: 
                            c=fgetc(input);
                            if (c=='Y') 
                                state=2;
                            break;
                        case 2:
                            c=fgetc(input);
                            if(c=='Z')
                                state=3;
                            break;
                        case 3:
                            c=fgetc(input);
                            if (c==1)
                                state=4;
                            break;
                        case 4:
                            if (c=='1') 
                                state=4;
                            else if(c=='*')
                                state=5;
                            else if(c=='\n' || c=='\t' || c==' ')
                                printf("ok");
                            break;
                        case 5:
                            if (c=='*') 
                                state=5;
                            else if(c=='\n' || c=='\t' || c==' ')
                                printf("ok");
                            break;
                    } // end of switch
                } // end of while(1)
            } // end of if(c=='x')
        } // end of while(!feof(input))
    } // end of else
    printf("bgika");
} // end of main

2 个答案:

答案 0 :(得分:0)

while(1)

这是你的问题。

在此while循环中,您的switch语句已满break;秒。这些break;只能让您离开switch并且不会让您退出while循环。你无法摆脱这种循环。

我根本不知道该程序应该做什么(我只花了5分钟修复格式化),所以我目前无法做出推荐的修复,但这就是问题所在。


Per @ woolstar的评论,内部while循环是不必要的。 while(!feof(input))可以负责重复调用switch语句。但是,您可能需要将int state = 1;移到此外部while循环之外。

答案 1 :(得分:0)

我认为你的做法是错误的。正如我从你的解释中所理解的那样,字符串必须以“XYZ1”开头,之后你可能无论多少1(只有1,而不是其他字符)。因此,使用strncmp检查第一部分非常简单,然后检查剩余字符是否全部为1.

c=fgetc(input);
if(strncmp(c, "XYZ1", 4) == 0){
    //check if remaining characters are 1
}else{
    //the string does not match
}

此外,虽然不鼓励(!feof(输入)):Why is “while ( !feof (file) )” always wrong?