2012-11-12 87 views
-1

我正在做CS50x類,我被困在一個小故障。我問他們發生了什麼事,沒有人知道發生了什麼事。Islower函數故障

每當我嘗試打印小寫字母f時,它總是以?的形式出現。嘗試以23作爲參數,並以abcdefghijklmnopqrstuvwxyz作爲輸入。它搞砸了。下面是代碼:

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

int main (int argc, string argv[]){ 
    if(argc !=2){ 
    return 1; 
    } 

    string x = GetString(); 
    int key = atoi(argv[1]); 

    for(int a = 0, n = strlen(x); a < n; a++){ 
    char i = key + x[a]; 

    if(islower(x[a])){ 
     if(i > 122){ 
     i = (i-122) + 96; 
     } 
    } 
    if(isupper(x[a])){ 
     if(i > 90){ 
      i = (i-90) + 64; 
     } 
    } 
    printf("%c", i); 
    } 

    printf("\n"); 
    return 0; 
} 

回答

3

我懷疑這是因爲你的char i默認爲signed。當您將23添加爲小寫字母時,任何超過104(即127-23)的內容都將轉換爲負值。看看你的代碼,它會保持負面的,因爲它沒有通過後續的測試,也不會被修改。

它通常是最好做char算術與int,再轉換回char ......但你也可能通過使用unsigned char解決這個問題。

+0

因爲OP使用'printf()'的'%c'轉換說明符輸出'i',所以'int'作爲參數就不需要轉換回'char'。簡單地將'i'的類型改爲'int'應該可以解決它。 – caf