1

感谢您的关注...我真的很困惑..为什么当我给 char 一个数组时,我不能将 char 类型转换为带有 toupper 的大写...就像这样的“char drh [1]”?

这是我的代码..这段代码还没有完成..我被困在中途了。

#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; 
}
4

3 回答 3

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);
于 2012-09-30T03:05:39.013 回答
2

该函数toupper接受一个字符,并且您传递给它一个字符数组(是的,drh[1]是一个字符的数组)。这行代码永远不会与数组一起使用:

drh = toupper(drh);

因为你不能像那样复制数组。您可能将单曲与单曲混淆charchar[1]。您只有一个选择,那就是更改 to 的drh声明char drh;

你会想要改变这行代码:

scanf("%s", &drh);

至:

scanf("%c", &drh);

因为您正在阅读一个字符而不是一个字符串。

于 2012-09-30T03:04:26.830 回答
0

toupper适用于单个字符,但您正试图将其应用于整个数组。编译器应该抱怨将整数转换为指针并返回或类似的东西——如果没有,请立即停止并打开警告。

要在 C 中大写整个“字符串”(以 nul 结尾的字符数组),您必须自己循环字符,如下所示:

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 终止符)。char drh[2]如果您想用来scanf("%s")读取一个字符,则需要这样做。当(不是如果)用户输入多个字符时,即使这样也无济于事;编写此程序的正确方法是使用fgets(或者,更好的是getline)读取整行,然后手动咀嚼它们(即使用sscanf)。基本上从长远来看,你想忘记你曾经听说过scanf或其亲属。不过,我不会责怪你想一次解决一个问题。

于 2012-09-30T03:05:04.513 回答