2012-09-30 32 views
1

感謝您的關注......我真的很困惑......爲什麼我不能將char類型轉換爲大寫字母,當我給字符數組時......就像這樣「char drh [1] 「?Toupper不能用字符數組工作

這是我的代碼..這段代碼還沒有完成..我卡在中途。

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

using namespace std; 
int main() 
{ 
    char nama[50], gender[6], drh[1]; 
    int tahun_l, usia; 
    float berat, tinggi, berat_i; 

    printf("Masukkan Data Anda\n\n"); 
    // INPUT ZONE 

    //First 
    printf("Nama\t\t\t\t: "); 
    scanf("%[^\n]", &nama); 

    printf("Tahun Lahir (yyyy)\t\t: "); 
    scanf("%d", &tahun_l); 

    printf("Gol Darah (A/B/C)\t\t: "); 
    scanf("%s", &drh); 

    system("cls"); 

    //Second 
    printf("Masukkan Data Anda\n\n"); 

    printf("Nama\t\t\t\t: %s\n", nama); 
    fflush(stdin); 

    printf("Tahun Lahir (yyyy)\t\t: %d\n", tahun_l); 
    fflush(stdin); 

    printf("Gol Darah (A/B/O)\t\t: %s\n", drh); 
    drh = toupper(drh); //not working 
    fflush(stdin); 

    printf("Jenis Kelamin (Pria/Wanita)\t: "); 
    scanf("%s", &gender); 

    printf("Berat Badan (kg)\t\t: "); 
    scanf("%f", &berat); 

    printf("Tinggi Badan (cm)\t\t: "); 
    scanf("%f", &tinggi); 

    //FORMULA ZONE 
    usia = 2008 - tahun_l; 
    berat_i = tinggi - 100 - (0.1 * (tinggi - 100)); 
    //OUTPUT ZONE 
    printf("\n%s, berdasarkan data yang Anda masukkan,\n", nama); 
    printf("Anda berjenis kelamin %s, saat ini Anda berusia %d tahun,\n", gender, usia); 
    printf("Berat badan = %.2f kg, tinggi badan = %.2f cm, golongan darah = %s \n", berat, tinggi, drh); 
    printf("\nBerat badan ideal adalah %.2f", berat_i); 

    getche(); 
    return 0; 
} 
+0

你得到什麼錯誤? –

+0

我得到了這個錯誤@IonutHulub [錯誤]從'char *'到'int'的無效轉換[-fpermissive] – messerchainey

+0

看起來像你得到了你對這個問題的答案。同樣,用'scanf(「%c」,&drh);''替換'scanf(「%s」,&drh);'',因爲如果讀取字符串scanf也會在drh [1]中添加'0'),並且可能導致內存損壞 –

回答

3

toupper函數對單個字符而不是字符串進行處理。如果您需要將整個字符串轉換爲大寫,你需要使用一個循環:

for (char *p = drh ; *p ; *p = toupper(*p), p++) 
    ; 

但是,你drh緩衝器不具有足夠的長度:它必須有2個字符,以適應空終止:

char nama[50], gender[6], drh[2]; 
// Add 1 char for terminator ^---- HERE 

而且,因爲你知道,drh是單個字符,您可以使用

*drh = toupper(*drh); 
+0

aieee!不要在'toupper'的調用中放置一個postincrement,它是一個宏,它可能不止一次地評估它的參數。 (我不記得C標準是否允許這樣做,但肯定有C實現它在那裏。) – zwol

+0

@Zack你是對的,保存幾個字符是不值得冒險的錯誤這裏。 – dasblinkenlight

+0

哦,我明白了..謝謝你的幫助大家:D ..感謝您的幫助@dasblinkenlight – messerchainey

2

功能toupper採用單個字符和要傳遞它的字符數組(是的,drh[1]是一個字符的陣列)。這行代碼將永遠不會與陣列一起工作:

drh = toupper(drh); 

因爲您不能複製這樣的數組。您可能會將charchar[1]混淆。您只有一個選項,即將drh的聲明更改爲char drh;

你會想改變這行代碼:

scanf("%s", &drh); 

到:

scanf("%c", &drh); 

,因爲你正在閱讀的字符不是一個字符串。

+0

感謝您回覆@Marlon ...我已經將char drh [1]更改爲char drh .. 。但它不工作太...它工作時,我刪除變量字符名[50],性別[10] ..所以當有一個字符數組類型,它不起作用 – messerchainey

0

toupper適用於個別字符,但您正試圖將其應用於整個數組。編譯器應該抱怨將整數轉換爲指針並返回,或者類似的東西 - 如果沒有,請立即停止並打開警告。

爲大寫C中的整個「串」(空終止字符數組),你必須遍歷所有的字符自己,就像這樣:

for (char *p = drh; *p; p++) 
    *p = toupper(*p); 

這是最慣用的方式做到這一點,但還讓我寫一個不同的方式,可以更清楚這是怎麼回事:

char *p = drh; 
while (*p != '\0')  // until we reach the end of the string 
{ 
    *p = toupper(*p); // upcase the character currently pointed to by 'p' 
    p++;    // advance to the next character 
} 

編輯:我沒有注意到,你傳遞一個一個字符陣列scanf。這將不可避免地破壞你的堆棧,因爲即使用戶合作並只鍵入一個字符,scanf也會將兩個字符寫入數組(用戶鍵入的字符以及必需的NUL終止符)。如果您想使用scanf("%s")讀取一個字符,則需要製作該文件char drh[2]。甚至當用戶輸入多於一個字符(而不是用戶輸入多個字符時)也無濟於事。 適當的方式來寫這個程序將使用fgets(或更好,getline)來讀取整個行,然後手動(即而不是sscanf)。基本上從長遠來看,你想忘記你曾聽說過scanf或其親戚。不過,我不會責怪你想一次解決一個問題。

+0

現在我明白爲什麼我的代碼遇到運行時錯誤..好的謝謝你的幫助@Zack ..我會試試這個代碼:D – messerchainey