C-if/else语句

C-if/else语句,c,C,我相当擅长if/else语句,这是一项非常古老的任务,最后我交了一部分。但我仍然想知道为什么我的代码不能工作 我希望我的用户输入姓名、身高和性别。然后,我的代码将显示一个完整的句子,上面写着姓名是X厘米高的男性,或者姓名是X厘米高的女性 当我输入name并输入时,它会立即跳过显示身高和性别。不管之后我输入了什么,它都会结束程序 输入名称:杰克 输入高度(厘米):180 男/女: 计算机$ 我一直在玩这个代码有一段时间了,但我已经被卡住了一段时间。任何帮助都将不胜感激。这是我的密码: #inclu

我相当擅长if/else语句,这是一项非常古老的任务,最后我交了一部分。但我仍然想知道为什么我的代码不能工作

我希望我的用户输入姓名、身高和性别。然后,我的代码将显示一个完整的句子,上面写着姓名是X厘米高的男性,或者姓名是X厘米高的女性

当我输入name并输入时,它会立即跳过显示身高和性别。不管之后我输入了什么,它都会结束程序

输入名称:杰克 输入高度(厘米):180 男/女: 计算机$

我一直在玩这个代码有一段时间了,但我已经被卡住了一段时间。任何帮助都将不胜感激。这是我的密码:

#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呢?