2013-03-02 34 views
3

我剛剛開始用C語言編程,並且正在編寫密碼/解密程序。用戶被要求鍵入一個存儲爲char *的短語。問題是程序僅存儲字符串的第一個單詞,然後忽略它後面的所有內容。下面是獲取字符串代碼的一部分,然後對其進行分析String只記錄第一個字

int maincalc(int k)       //The Calculation Function for Cyphering 
{ 
    char *s; 
    s=(char*) malloc(sizeof(100)); 
    printf("Please enter the phrase that you would like to code: "); 
    fscanf(stdin,"%s %99[^\n]", s); 
    int i=0; 
    int n=strlen(s); 

    while(i<n) 
    { 
     if(s[i]>=65&&s[i]<=90)    //For Uppercase letters 
     { 
      int u=s[i]; 
      int c=uppercalc(u,k); 
      printf("%c",c); 
     } 
     else if(s[i]>=97&&s[i]<=122) //For Lowercase letters 
     { 
      int u=s[i]; 
      int c=lowercalc(u,k); 
      printf("%c",c); 
     } 
     else 
      printf("%c",s[i]);   //For non letters 
     i++; 
    } 
    free(s); 
    printf("\n"); 
    return 0; 
} 

只需要知道如何做才能讓程序確認,不僅整個字符串的第一個字的存在。謝謝

+1

+1因爲沒有考慮'gets()' – axiom 2013-03-02 13:41:09

+0

我太新了,不能靠近gets()我不希望我的電腦爆炸。 – shea 2013-03-02 14:02:32

回答

2

不,都沒有工作。使用fscanf不會等待用戶輸入。它只是打印「請輸入詞組...」然後退出fgets也做同樣的事情,程序不會等待輸入,只是打印「PLease enter ...」,然後退出。

在該評論中,在編輯之前,您提到了一些以前的輸入。我的心理調試能力告訴我,前一個輸入的換行符仍然在輸入緩衝區中。這將使

fgets(s, 100, stdin); 

fscanf(stdin, "%99[^\n]", s); 

立即返回,因爲他們馬上遇到信號輸入端的換行符。

在獲取更多字符串輸入之前,您需要從緩衝區中消耗換行符。你可以使用

fscanf(stdin, " %99[^\n]", s); 

在格式開頭的空間消耗任何初始空白在輸入緩衝區,或獲取輸入與任何fgetsfscanf之前清除輸入緩衝區

int ch; 
while((ch = getchar()) != EOF && ch != '\n); 
if (ch == EOF) { 
    // input stream broken? 
    exit(EXIT_FAILURE); 
} 

+1

良好的調試能力:-) – cnicutar 2013-03-02 14:09:19

+0

是的,有一個先前的輸入,一個int。但是,在用戶輸入數字(這是密碼/破譯腐敗)程序繼續之後,代碼中的任何地方都沒有/ n。我沒有指定一個新行,但它可能會被程序自動按慣例放在那裏。 – shea 2013-03-02 14:22:17

+1

Bravo, fscanf(stdin,「%99 [^ \ n]」,s);解決它,謝謝 – shea 2013-03-02 14:24:53