感谢您的关注...我真的很困惑。为什么我不能将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;
}
答案 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);
因为您无法复制这样的数组。您可能会将char
与char[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
或其亲属。不过,我不会责怪你想要一次解决一个问题。