2013-03-11 78 views
0

我在C做练习,但我有一个问题,当我和我想重复cicle(做while)时,事实上,如果我输入1程序再次从顶部开始,但它不止于gets(testo);。我尝试了很多方法来解决错误,没有解决方案,谁能帮助我?字符串,得到和做

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

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;i<cch;i++){ 
           if(testo[i]==' ' && testo[i+1]==' '){ 
             cw--; 
           } 
         } 

         //Don't count as word if the text start with a space 
         if(testo[0]==' '){ 
           cw--; 
           w--; 
         } 

         printf("\nThe text is composed by %d characters\n", cch); 
         printf("The text is composed by %d words\n", cw); 

         if(cw>0){ 
           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<cw;i++){ 
             printf("%d> %s\n", i+1, &alfa[i]); 
           } 

           //order 
           f=1; 
           printf("\nWords used in alphabetical order:\n"); 
           while(f==1){ 
             f=0; 
             for(i=0;i<cw-1;i++){ 
               ord=strcmp(alfa[i],alfa[i+1]); 
               if(ord>0){ 
               strcpy(swap,alfa[i]); 
               strcpy(alfa[i],alfa[i+1]); 
               strcpy(alfa[i+1],swap); 
               f=1; 
               }  
             } 
           } 

           for(i=0;i<cw;i++){ 
             printf("%d> %s\n", i+1, alfa[i]); 
           } 
         } 
       } 

     printf("\nDo you want write another text? (1=yes) -> "); 
     scanf("%d", &j); 

     }while(j==1); 
} 

我知道这是不是为代码在此刻非常优化并具有其他错误,但我对这个有问题。

谢谢。

PS:该代码是在OpenVMS上

回答

1

你的第一个也是最明显的问题是在换行符上留下了余下的部分。当您使用scanf()这里:

printf("\nDo you want write another text? (1=yes) -> "); 
    scanf("%d", &j); 
} 

并使用%d格式specificer,功能正在寻找一个数字,当你输入一个号码真的是你正在进入一个号码和一个换行符

> 1<enter key> // 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. 你的主真的应该返回一个int类型,即使它只是一个return 0
  2. 你不应该使用gets(),即使再man pagegets()永远不要使用gets()。这通常是一个不错的指示。 ;)所以更换fgets(testo, sizeof(testo), stdin);
  3. 该行你错过了一个性能specificer这里:printf("\nThe text is composed by % characters\n", cch);所以你得到的垃圾产量,本来应该%d
+0

谢谢,我会试试。对于第三点,我忘了在翻译过程中放置​​%d;) – Mitro 2013-03-14 14:23:58

+1

@AlessioMTX - 是的,我认为缺少'%d'的东西在翻译时被遗忘了,似乎很明显是错过了。祝你好运,让我知道你是否有任何后续问题。再见。 – Mike 2013-03-14 14:46:03

+0

解决:D谢谢;) – Mitro 2013-03-14 20:37:49

5

这是因为scanf呼叫在循环结束不读取新行测试。相反,您的gets呼叫会读取此换行符。

一个简单的解决方案是将一个空间添加到scanf格式字符串的末尾,像这样:

scanf("%d ", &j); 

这将使scanf跳过在输入尾随空白。

另一种解决方案是把一个额外的fgetsscanf后,但随后没有在格式字符串添加额外的空间:

scanf("%d", &j); 
fgets(testo, sizeof(testo), stdin); 

或者使用fgets获得行,然后用sscanf来提取答案:

fgets(testo, sizeof(testo), stdin); 
sscanf(testo, "%d", &j); 
+0

如果我把空间,当我执行程序一切就OK了,但在此之后我输入1 e给出输入,写入文本不显示。 – Mitro 2013-03-11 14:01:00

+0

如果我输入2后,我必须再次输入(两次) – Mitro 2013-03-11 14:02:26

+0

@AlessioMTX我不知道我遵循你的意思吗? – 2013-03-11 14:17:57

1

或者你可以尝试使用功能flushall()之前得到()

+0

flushall给我错误:在这个声明中,标识符“flushall”被隐含地声明为一个函数。我有使用/添加另一个头文件吗? – Mitro 2013-03-11 14:04:48

+0

嗯不,它可以和TC和VS一起使用。我不确定OpenVMS – SureshS 2013-03-11 14:15:51

+0

现在我搜索类似OpenVMS上使用的东西 – Mitro 2013-03-11 14:27:26