user-0 提问: 华为oj的坐标移动问题

回复:
user: user-1
content: 解决这种string parse类问题的万灵丹是有限状态自动机。 参考《编译原理》中的词法分析和有限状态自动机。

user: user-1
content: 题目中没说最长100个字符。 再供参考：#include <stdio.h> #include <string.h> char s[80]; int i; char c; int main() {     while (1) {         printf("Input a integer:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>10) {             printf("Input too long(>9)!\n");             continue;         }         if (2==sscanf(s,"%d%c",&i,&c)) {             if ('\n'==c) {                 printf("%d is a integer.\n",i);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a integer!\n",s);     }     return 0; }

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End. 更改了之后，我觉得很好了，为什么还是错误 #include <stdio.h> int main(void) {     int x=0,y=0,temp=0,k,n;     char first,check;     char string[100];     char *str;     gets(string);     str=string;     while(1)     {             k=sscanf(str,"%c%d%c%n",&first,&temp,&check,&n);             //putchar(first);            putchar(check);             printf("%d\n",temp);             printf("%d\n",k);             if(-1==k)                 break;             if((first==';')||(0==temp))//             {                 str++;                 //puts(str);                 continue;             }             else if(';'!=check)             {                 if(*str=='\n')                     break;                 while((*str++)!=';')                 continue;             }     if((k==3)&&(';'==check))     {          switch (first)         {             case 'A':x=x-temp;break;             case 'S':y=y-temp;break;             case 'D':x=x+temp;break;             case 'W':y=y+temp;break;         }         str+=n;         temp=0;           //puts(str);     }     else     {          break;     }     }     printf("%d,%d",x,y);     return 0;  }

user: user-0
content: 引用 2 楼 github_27756899 的回复:[quote=引用 楼主 iuedui 的回复:]  题目大概就是这样，以下是我的代码 #include<stdio.h> int main(void) {     int x=0,y=0,temp=0;     char first,last;     while((first=getchar())!='\n')     {             if(scanf("%d",&temp)==0)             {                 while((last=getchar())!=';');                 continue;             }             last=getchar();             if(last=='\n')                break;             if(last!=';')             {                 while((last=getchar())!=';');                 continue;             }         switch (first)         {               case 'A':x=x-temp;break;             case 'S':y=y-temp;break;             case 'D':x=x+temp;break;             case 'W':y=y+temp;break;         }     }     printf("%d,%d",x,y);     return 0; }  但是代码有一个bug，就是最后输入两个';'时会卡在scanf那里等待一个数据输入 请问如何解决这个问题？             if(first == ';')   //添加的部分 			continue;       //添加的部分             if(scanf("%d",&temp)==0)             {                 while((last=getchar())!=';');                 continue;             }[/quote]代码贴进去，提示时间超限

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。代码其实没有问题，但是确实有一个bug，就是输入最后没有加入";"的时候会出现问题，而华为的那个测试平台的一个测试用例正好是最后不加分号，所以我多加了一段程序，就是不论输入如何，都通过程序在最后加入一个分号再处理，最后提交后显示答案正确，谢谢赵老师了！

user: user-2
content: 引用 楼主 iuedui 的回复: 题目大概就是这样，以下是我的代码 #include<stdio.h> int main(void) {     int x=0,y=0,temp=0;     char first,last;     while((first=getchar())!='\n')     {             if(scanf("%d",&temp)==0)             {                 while((last=getchar())!=';');                 continue;             }             last=getchar();             if(last=='\n')                break;             if(last!=';')             {                 while((last=getchar())!=';');                 continue;             }         switch (first)         {               case 'A':x=x-temp;break;             case 'S':y=y-temp;break;             case 'D':x=x+temp;break;             case 'W':y=y+temp;break;         }     }     printf("%d,%d",x,y);     return 0; }  但是代码有一个bug，就是最后输入两个';'时会卡在scanf那里等待一个数据输入 请问如何解决这个问题？             if(first == ';')   //添加的部分 			continue;       //添加的部分             if(scanf("%d",&temp)==0)             {                 while((last=getchar())!=';');                 continue;             }

user: user-1
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.