使用 getchar() 读取字符串的 C 提示排序

标签 c

<分区>

这是一个新手问题。我是 C 编程的新手。我有以下代码,它不会提示输入“姓名”一旦输入“年龄”,它就会绕过“姓名”部分。

#include <stdio.h>

int main()
{
    char name[30],ch;
    int age;

    printf("Enter age : ");
    scanf("%d", &age);

    int i=0;
    printf("Enter name: ");

    while((ch = getchar())!='\n')
    {
        name[i]=ch;
        i++;
    }
    name[i]='\0';

    printf("Name: %s\n",name);
    printf("Age : %d\n", age);
    return 0;
}

阅读第一个提示后,它会绕过使用 getchar() 函数的第二个提示。但是,如果我更改提示顺序,先询问“姓名”,然后再询问“年龄”,它就可以正常工作。

工作代码。

#include <stdio.h>

int main()
{
    char name[30],ch;
    int age;

    int i=0;
    printf("Enter name: ");

    while((ch = getchar())!='\n')
    {
        name[i]=ch;
        i++;
    }
    name[i]='\0';

    printf("Enter age : ");
    scanf("%d", &age);

    printf("Name: %s\n",name);
    printf("Age : %d\n", age);
    return 0;
}

我的编码 IDE 是 CodeBlock,我的编译器是 GNU C Compiler (mingw32-gcc.exe)

请帮我突破。

最佳答案

问题中代码的一些改进/建议:

  1. getchar()的返回值类型是int,所以ch的类型也应该是int
  2. 您可以(我相信也应该)使用格式 %s 来读取 name,这样更容易并且输入流中的前导空格不会一个问题
  3. 代码的用户可以给出一个包含超过 30 个字符的名称,并且此输入可能会使您的程序崩溃,因此您应该针对这种可能性保护您的代码。您有两个选择:

    一个。使用格式 '%29s"读取 name
    b.将name的定义修改为char *name,通过scanf("%ms", &name);读取,调用 free(name); 在你不再需要它之后

这是一个例子,其中的名字可以很长并且可以包含空格:

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    char *name;
    int age;

    printf("Enter name: ");
    scanf("%m[^\n]", &name);

    printf("Enter age: ");
    scanf("%d", &age);

    printf("Name: %s\n", name);
    printf("Age : %d\n", age);

    free(name);

    exit(EXIT_SUCCESS);
}

下面是它的运行:

$ ./a.out 
Enter name: a very looooooooooooooooooooooooooooooooooooooooooooooong name
Enter age: 12
Name: a very looooooooooooooooooooooooooooooooooooooooooooooong name
Age : 12

关于使用 getchar() 读取字符串的 C 提示排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20868904/

相关文章:

c - 如何区分C中的函数指针是指向函数1还是函数2

c - 协助基本位操作

c - EOF 宏如何与 getchar 一起使用?

c - C 中的可选回调

c - 文件系统树遍历

检查 C 中的特殊字符

c - Eclipse cdt在两个项目中使用一个库

iphone - 在 objective-c 中添加两个 double 值的问题

c - 我需要帮助将 Intel 内联 asm 转换为 AT&T,以便我可以使用 gcc 编译它

c - 如何将保存矩阵固定到链表中