2016-09-25 44 views
0

我是一個begginer所以我卡在這部分。我需要輸入一條消息,並將字母移到'加密'消息的位移量。 問題是它不顯示任何文本,它只是從不退出while循環。使用sscanf()函數讀取一個字符串

任何幫助將不勝感激。

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

int main(void) 
{ 

    char ch,message[50]={0}; 
    int shift; 


    printf("Enter message to be encrypted: "); 
    scanf("%s",message); 
    printf("Enter shift amount (1-25): "); 
    scanf("%d",&shift); 

    printf("Encrypted message: "); 

    while((sscanf(message," %c",&ch) == 1) && (ch != '\n')); 
    { 
     ch += shift; 
     putchar(ch); 
    } 

    return 0; 
} 

輸出:

Enter message to be encrypted: abcABC 
Enter shift amount (1-25): 3 
Encrypted message: 

(有計劃是stucked在infite環)

+2

你有「;」在while語句末尾 – ColdSteel

+0

另請參見http://www.cplusplus.com/reference/cstdio/sscanf/ 您始終只讀取「message」的第一個字符 – ColdSteel

+0

但由於您的消息有一個定義的大小我會建議使用for循環 - >它會更安全 – ColdSteel

回答

1

有幾件事與你的代碼 a)你有「;」在您的while b)結束時,您總是隻讀取sscanf 中的第一個字符,這就是您處於無限循環中的原因。 我建議用for環代替,如下所示。

scanf自動將'\ 0'追加到字符串的末尾。

int i; 
for(i=0 ; i<50 && mesage[i] != '\0'; i++) 
{ 
    ch = message[i]; 
    ch += shift; 
    putchar(ch); 
} 
+0

我收到加密的消息,但後面有很多字符。 – tadm123

1

您錯誤地使用sscanf。它將始終只讀取第一個字符。

試試這個來實現你想要的。

int i=0; 
while(i<strlen(message)) 
{ 
    ch=message[i++]; 
    ch += shift; 
    putchar(ch); 
} 
+0

我可能會誤解,但是有沒有什麼理由可以使用'fscanf'來檢查文件中的每個字符,但不是'sscanf',這是假設爲字符串做同樣的事情? – tadm123

+0

@ tadm123'fsacnf'被起訴與'FILE's一起使用請參閱參考資料http://www.cplusplus.com/reference/cstdio/fscanf/。 – ColdSteel

+0

我知道,我正在說@ user3351949。我認爲對於一個字符串使用sscanf等同於對文件使用fscanf。 – tadm123