感谢您的关注。。。我真的很困惑。。为什么当我给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);
因为你不能复制这样的数组。您可能混淆了单个char
和char[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
或它的亲戚。不过,我不会责怪你想一次解决一个问题。