2013-03-11 122 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