Toupper无法使用char数组

  • 本文关键字:char 数组 Toupper 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 Andann");
// INPUT ZONE
//First
printf("Namatttt: ");
scanf("%[^n]", &nama);
printf("Tahun Lahir (yyyy)tt: ");
scanf("%d", &tahun_l);
printf("Gol Darah (A/B/C)tt: ");
scanf("%s", &drh);
system("cls");
//Second
printf("Masukkan Data Andann");
printf("Namatttt: %sn", nama);
fflush(stdin);
printf("Tahun Lahir (yyyy)tt: %dn", tahun_l);
fflush(stdin);
printf("Gol Darah (A/B/O)tt: %sn", drh);
drh = toupper(drh); //not working
fflush(stdin);
printf("Jenis Kelamin (Pria/Wanita)t: ");
scanf("%s", &gender);
printf("Berat Badan (kg)tt: ");
scanf("%f", &berat);
printf("Tinggi Badan (cm)tt: ");
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; 
}

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

函数toupper接受一个字符,您将向它传递一个字符数组(是的,drh[1]是一个字符的数组)。这行代码永远不会与数组一起工作:

drh = toupper(drh);

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

你会想更改这行代码:

scanf("%s", &drh);

至:

scanf("%c", &drh);

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

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

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

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

这是最惯用的方法,但让我也用另一种方式来写,这可能会让它更清楚地表明发生了什么:

char *p = drh;
while (*p != '')     // 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或它的亲戚。不过,我不会责怪你想一次解决一个问题。

最新更新