字符串,获取和做
我正在用C做练习,但是我有一个问题,当我想重复cicle(做的时候),事实上,如果我输入1,程序再次由顶部开始,但它不会停止在gets(testo);
。 在没有解决方案的情况下,我尝试了很多方法来解决错误,有人可以帮助我吗?
#include #include #include main(){ int cch, cw, i, j, w, ord, f; //counter and index char testo[80]; char alfa[50][25]; char swap[25]; do{ cch=0; cw=0; j=0; w=0; f=0; for(i=0;i<80;i++){ testo[i]='\0'; } printf("Write the text:\n"); gets(testo); //initialization 2d array for(i=0;i<50;i++){ for(j=0;j<25;j++){ alfa[i][j]='\0'; } } j=0; //Count word and characters if(testo[0]!='\0'){ cw=1; for(i=0;testo[i]!='\0';i++){ cch++; if(testo[i]==' '){ cw++; j++; } } } if(cch==j){ printf("You haven't written any word\n\n"); } else{ //Don't count double space for(i=0;i0){ printf("\nUsed words:\n"); for(j=0;j<cch;j++){ if(testo[j]==' ' && testo[j+1]==' '){ //nothing to do } else{ if(testo[j]!=' '){ alfa[w][f]=testo[j]; f++; } else if(testo[j]=='\0'){ alfa[w][f]='\0'; f=0; w=0; } else{ alfa[w][f]='\0'; w++; f=0; } } } for(i=0;i %s\n", i+1, &alfa[i]); } //order f=1; printf("\nWords used in alphabetical order:\n"); while(f==1){ f=0; for(i=0;i0){ strcpy(swap,alfa[i]); strcpy(alfa[i],alfa[i+1]); strcpy(alfa[i+1],swap); f=1; } } } for(i=0;i %s\n", i+1, alfa[i]); } } } printf("\nDo you want write another text? (1=yes) -> "); scanf("%d", &j); }while(j==1); }
我知道目前代码并没有非常优化并且有其他错误,但是我遇到了问题。
谢谢。
PS:代码在OpenVMS上测试
你的第一个也是最明显的问题是左边的换行符。 当你在这里使用scanf()
:
printf("\nDo you want write another text? (1=yes) -> "); scanf("%d", &j); }
并且您使用%d
格式特定程序,该函数正在查找数字,当您输入数字时,您确实输入了数字和换行符
> 1 // which means on stdin you're getting '1''\n'
scanf()
只获取1并离开你的gets()
函数然后拾取的换行符,所以看起来它正在跳过输入。 您需要做的就是使用换行符,一个快速解决方法是使用getchar()
来使用它:
printf("\nDo you want write another text? (1=yes) -> "); scanf("%d", &j); getchar(); }
现在你的程序正如你所期望的那样工作。
其他注意事项:
- 你的main应该真的返回一个
int
类型,即使它只是一个return 0
- 你不应该使用
gets()
,即使然后mangets()
man页面也说使用gets()。 这通常是一个不好的迹象。 ;)所以用fgets(testo, sizeof(testo), stdin);
替换该行fgets(testo, sizeof(testo), stdin);
- 你在这里错过了一个性能特异性:
printf("\nThe text is composed by % characters\n", cch);
所以你得到垃圾输出,应该是%d
这是因为循环结束时的scanf
调用不会读取换行符。 相反,这个换行符会被你gets
来电读取。
一个简单的解决方案是在scanf
格式字符串的末尾添加一个空格,如下所示:
scanf("%d ", &j);
这将使scanf
在输入中跳过尾随空格。
另一个解决方案是在scanf
之后添加额外的fgets
,但是不要在格式字符串中添加额外的空格:
scanf("%d", &j); fgets(testo, sizeof(testo), stdin);
或者使用fgets
获取该行,然后使用sscanf
提取答案:
fgets(testo, sizeof(testo), stdin); sscanf(testo, "%d", &j);
或者你可以尝试在gets()之前使用函数flushall ()