Toupper不使用char数组

时间:2012-09-30 02:58:01

标签: c

感谢您的关注...我真的很困惑。为什么我不能将char类型转换为使用toupper的大写字母,当我给char一个数组时...就像这个“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; 
}

3 个答案:

答案 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);

答案 1 :(得分:2)

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

drh = toupper(drh);

因为您无法复制这样的数组。您可能会将charchar[1]混淆。您只有一个选项,即将drh的声明更改为char drh;

你会想要改变这行代码:

scanf("%s", &drh);

为:

scanf("%c", &drh);

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

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