C-if/else语句
我相当擅长if/else语句,这是一项非常古老的任务,最后我交了一部分。但我仍然想知道为什么我的代码不能工作 我希望我的用户输入姓名、身高和性别。然后,我的代码将显示一个完整的句子,上面写着姓名是X厘米高的男性,或者姓名是X厘米高的女性 当我输入name并输入时,它会立即跳过显示身高和性别。不管之后我输入了什么,它都会结束程序 输入名称:杰克 输入高度(厘米):180 男/女: 计算机$ 我一直在玩这个代码有一段时间了,但我已经被卡住了一段时间。任何帮助都将不胜感激。这是我的密码:C-if/else语句,c,C,我相当擅长if/else语句,这是一项非常古老的任务,最后我交了一部分。但我仍然想知道为什么我的代码不能工作 我希望我的用户输入姓名、身高和性别。然后,我的代码将显示一个完整的句子,上面写着姓名是X厘米高的男性,或者姓名是X厘米高的女性 当我输入name并输入时,它会立即跳过显示身高和性别。不管之后我输入了什么,它都会结束程序 输入名称:杰克 输入高度(厘米):180 男/女: 计算机$ 我一直在玩这个代码有一段时间了,但我已经被卡住了一段时间。任何帮助都将不胜感激。这是我的密码: #inclu
#include<stdio.h>
int main() {
char name[30];
char sex;
float height;
printf("Input name: ");
scanf("%s", name);
fflush(stdin);
printf("Input height in cm: ");
scanf("%f", &height);
fflush(stdin);
printf("sex(M/F): ");
scanf("%c", &sex);
if (sex == 'M')
{
printf("%s is %f cm tall and male", name, height);
}
else if (sex == 'F')
{
printf("%s is %f cm tall and female", name, height);
}
printf("\n");
return 0;
}
从我所能看到的,它只跳过了性的部分——老实说,这是非常可悲的 然后它立即跳过显示高度和性别 输入名称:插孔输入高度(厘米):180厘米/英尺:计算机$ 您可以尝试以下方法:
scanf(" %c", &sex);
^
空格会让scanf在读一个角色之前先吃空格。从我所能看到的来看,它只跳过了性部分——老实说,这是非常悲哀的 然后它立即跳过显示高度和性别 输入名称:插孔输入高度(厘米):180厘米/英尺:计算机$ 您可以尝试以下方法:
scanf(" %c", &sex);
^
空格会导致scanf在读取字符之前先吃空格。fflushstdin是一种非常糟糕的未定义行为。应使用其他函数调用替换此调用,例如:
static void
clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
有了它,它似乎起作用了。fflushstdin是一个非常糟糕的主意,没有定义的行为。应使用其他函数调用替换此调用,例如:
static void
clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
有了它,它似乎起作用了。您在第9行丢失了一个符号和:
scanf("%s", name);
应该是:
scanf("%s", &name);
也许这会有所帮助您在第9行缺少一个符号和:
scanf("%s", name);
应该是:
scanf("%s", &name);
也许这有帮助,你也可以试试这个
printf("sex(M/F): ");
scanf("%s", &sex);
你也可以试试这个
printf("sex(M/F): ");
scanf("%s", &sex);
要从stdin中读取单个字符,必须使用getchar而不是scanf%c,&c
或者将sex的变量类型更改为char[2],并使用scanf%s,sex从stdin中读取单个字符,您必须使用getchar而不是scanf%c,&c
或者将sex的变量类型更改为char[2]并使用scanf%s,sex值是否仍然相同?对不起,如果我错了,我想编译器会填补空白。@Bluecat scanf对输入非常挑剔。有些说明符占用空间,有些则不占用。详细说明原因,这是因为当试图将性别作为单个字符读取时,缓冲区中已经存在换行符,scanf将性别设置为换行符。在格式代码前面添加空格会告诉scanf跳过空格,即空格、制表符和换行符。好的,我刚刚尝试了你的解决方案,它在GCC/Linux 3.4上运行。为什么会发生这种情况,我不明白为什么需要一个空间?@JoachimPileborg我故意使用了fflushstdin;更新输入缓冲区。这难道不足以解决这个问题吗?值是否仍然相同?对不起,如果我错了,我想编译器会填补空白。@Bluecat scanf对输入非常挑剔。有些说明符占用空间,有些则不占用。详细说明原因,这是因为当试图将性别作为单个字符读取时,缓冲区中已经存在换行符,scanf将性别设置为换行符。在格式代码前面添加空格会告诉scanf跳过空格,即空格、制表符和换行符。好的,我刚刚尝试了你的解决方案,它在GCC/Linux 3.4上运行。为什么会发生这种情况,我不明白为什么需要一个空间?@JoachimPileborg我故意使用了fflushstdin;更新输入缓冲区。这不是应该解决这个问题吗?我在C++的编译下工作了。虽然我愚蠢地把f改成了f。。所以第一次打印没有。我在C++下编译时工作。虽然我愚蠢地把f改成了f。。所以第一次没有打印。scanf%s,name;够了。不需要&@TheBlueCat我被告知,因为C中的字符串已经是一个字符数组,这是一个指针值,在上面加上&将是重复的。@TheBlueCat它在技术上没有错,因为获取数组地址与使用数组本身是一样的。即名称==&名称。但是,它只适用于数组,而不适用于指针,因此如果您有char*nameptr=name;,然后使用&nameptr将实际返回指针的地址,而不是它指向的地址。scanf%s,name;够了。不需要&@TheBlueCat我被告知,因为C中的字符串已经是一个字符数组,这是一个指针值,在上面加上&将是重复的。@TheBlueCat它在技术上没有错,因为获取数组地址与使用数组本身是一样的。即名称==&名称。但是,它只适用于数组,不适用于指针,所以如果您有char*nameptr=na
我然后使用&nameptr实际上会返回指针的地址,而不是它所指向的地址。是的,编译器和朋友多次告诉我不要使用scanf和get,但我担心我在被教导使用这些函数后已经习惯了。@Danny,为什么不使用fgets呢?是的,编译器和朋友多次告诉我不要使用scanf和GET,但我担心在我被教过如何使用这些函数之后,我已经习惯了。@Danny,为什么不直接使用fgets呢?