字符串,获取和做

我正在用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(); } 

现在你的程序正如你所期望的那样工作。


其他注意事项:

  1. 你的main应该真的返回一个int类型,即使它只是一个return 0
  2. 你不应该使用gets() ,即使然后man gets() man页面也说使用gets()。 这通常是一个不好的迹象。 ;)所以用fgets(testo, sizeof(testo), stdin);替换该行fgets(testo, sizeof(testo), stdin);
  3. 你在这里错过了一个性能特异性: 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 ()