我希望问题按顺序识别单词:XYZ1111***
无论多少'1'或'*',但它必须至少有一个'1',XYZ必须按照确切的顺序始终包含在字符串中有效。它必须从我写过很多这些单词的文件中读取,例如XYZ1
,XYZ1111*
,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
答案 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?