2014-09-27 23 views
0

我有這個代碼毛刺,我不知道如何解決它。字符串驗證:試圖尋求一個新的字符串時,舊的有無效字符

我想一個字符時間閱讀的隨機字符的字符串inputed。

一旦無效字符被讀取,我想程序停止讀取字符串,並提示用戶輸入一個新的字符串。

該程序也將只讀取和除非串的端部被此5個字符的限制之前遇到了無論串長度存儲到5個字符。

代碼:

int check; //1 = invalid char in string, 2 = otherwise 
    char c; 
    char seq[5]; 

    do{  printf("Enter a string of only "+" and "-" \n"); 

      for(i=0; c!=EOF || i<5 ; i++){ 
        scanf("%c",&seq[i]); 
        if((seq[i] != '\x2b') || (oseq[i] != '\x2d')){ 
          printf("invalid sequence, try again\n"); 
          check=1; 
          break; 
        } 
        check=2; 
      } 

    }while(check==1); 

請幫幫忙,我知道這是一個簡單的解決方案,但它只是不來找我,我已經搜查/用盡了一切辦法。

我要補充,該代碼繼續閱讀,每到達一個無效字符,它讓用戶輸入一個新的,直到它到達字符串的結束時間將打印出來。

+0

你應該將'for'表達式分割爲'''讀取'c'與'i'的數目分開。也許是'while((c = getchar())!= EOF)'。另外,如果你使用'getchar','c'應該是'int'。然後你需要一個簡單的'最多5個字符的字符隊列來存儲你的5個字符的歷史記錄。有很多例子。 – 2014-09-27 17:02:35

+0

您應該閱讀整行輸入,驗證它,然後決定使用它還是提示用戶輸入另一行。否則,您會如何知道「無效舊」輸入結束以及「更新新」輸入開始的位置。 – 5gon12eder 2014-09-27 17:05:21

+0

我想過這樣做,但無法弄清楚我將如何檢查字符串的每個單獨的字符,以查看它是否有效。 我能想到如何在java(字符串標記器)中做到這一點,但在c中的等效操作是什麼。 – 2014-09-27 17:18:41

回答

0

考慮一下你的電流回路是要幹什麼:

 for(i=0; c!=EOF || i<5 ; i++){ 

對於i從0開始,運行,而c是不EOF或i小於5

因此,如果c是不EOF,i是0,1,2,3,4,5,6,7 ,。 .. 1000,因爲只要「c!= EOF」我們的代碼就會忽略我。

訪問seq [1000]不是你想要的。

另外,就c而言,您最初的for循環迭代檢查c != EOF,但您從未將c初始化爲值。這是未定義的行爲,c可能是任何東西,所以你的循環可能運行或可能永遠不會運行c恰好從與EOF定義爲相同的值開始。

我建議你只簡化爲:

 for(i=0; i<5 ; i++){ 

然後讓你的合法性檢查的循環中,如果c是EOF或其他一些無效的值,使用break退出for循環,並保持你的(。 ..)條件簡單。此更改將解決您for循環的兩個問題。

除此之外,您聲明的意圖是存儲多達5個字符。在C中,如果打算將字符數組視爲字符串,則必須爲尾部空終止字符留出空間,因此始終使用N + 1來表示數組大小。如果打算稍後打印,則應使用seq[6],並確保將字符串的最後一個字符(在讀取最後一個字符後)設置爲0(或'\ 0')。

根據您的無限循環問題,您正在被使用scanf()這個很差的輸入函數的老年初學者的運氣抓住了。我一直在C編寫了20年,說實話,我忘了19年前如何有效地使用scanf,因爲它不適合大多數輸入需求(我喜歡它的兄弟printf,但那是另一回事)。 scanf()會精確地掃描你所要求的內容,但是如果它不處理輸入,它將使其不被掃描。如果考慮輸入字符並返回時,實際上輸入的是2個字符(在UNIX上計數\ n或在Windows/DOS上計數爲3的計數爲\ r)。在你的情況下,你每次迭代緩衝附加字符。

您可以在scanf()調用後用類似的方法清除輸入緩衝區。

while ((ch = getchar()) != '\n' && ch != EOF); 

但我避免了scanf()並直接使用fgets()或getchar()。 scanf()將被避免。所有C程序員都是在學校開始學習scanf(),然後他們最終學會了除了格式化文件之外的任何東西。

+0

嗯,我明白你在說什麼,但我的主要問題是編輯。一旦scanf讀入一個無效字符,我嘗試使用if語句檢查它,代碼不會停止讀取字符串,並立即提示用戶輸入新字符串。它將打印出「無效字符串,再試一次」,「請輸入一個字符串...」多次,對應於讀取的無效字符數量。這是我整個代碼的主要問題。 – 2014-09-27 17:17:08

+0

看到我的編輯,scanf()是你的問題。清除輸入緩衝區,否則處理換行符。如果這是爲了學校,請教授允許您使用更好的功能,如fgets()。 scanf()或其他需要特定輸入格式的函數不適合處理線路緩衝控制檯上的任意用戶輸入。 – codenheim 2014-09-27 17:46:54

+0

謝謝你的幫助!我完全重寫了代碼,它現在就是我想要的。這是但這不是問題或要求的一部分,所以我不會對它進行評分。事實上,我甚至不需要輸入這些代碼。這只是額外的工作,使其運行更流暢。 – 2014-09-27 18:21:42

0

我相信你不會初始化稱爲 'C' 變量...

也許

焦C =空述說。 或 char c = 0;

,並用它在你的循環

的scanf( 「%C」,& C);

seq [i] = c;

否則你的支票!C = EOF將假/模棱兩可/未定義

而且,在第一時間進入了

for(i=0; c!=EOF || i<5 ; i++) 

循環,檢查......你有沒有爲c設置值 - 因此任何事情都可能會意外發生,並且您使用的是OR而不是AND。它應該是:

的(!i = 0; C = EOF & &我< 5;我++)

相關問題