c - 带空格的字符串输入

标签 c string gcc ubuntu

<分区>

我正在尝试在基本 C 类的基本 ubuntu gcc 编译器中运行以下代码。

#include<stdio.h>

struct emp
{

  int emp_num, basic;
  char name[20], department[20];

};

struct emp read()
{
  struct emp dat;

  printf("\n Enter Name : \n");
  scanf("%s", dat.name);

  printf("Enter Employee no.");
  scanf("%d", &dat.emp_num);

  //printf("Enter department:");
  //fgets(dat->department,20,stdin);

  printf("Enter basic :");
  scanf("%d", &dat.basic);

  return dat;
}

void print(struct emp dat)
{
  printf("\n Name : %s", dat.name);

  printf("\nEmployee no. : %d", dat.emp_num);

  //printf("Department: %s", dat.department);

  printf("\nBasic : %d\n", dat.basic);
}

int main()
{
  struct emp list[10];

  for (int i = 0; i < 3; i++)
  {
    printf("Enter Employee data\n %d :\n", i + 1);
    list[i] = read();
  }

  printf("\n The data entered is as:\n");

  for (int i = 0; i < 3; i++)
  {
    print(list[i]);
  }

  return 0;
}

我希望名称接受空格。

当我将值输入到结构中时,问题就来了。我可以在第一次输入名称,但随后的迭代甚至不会提示我输入。

我尝试过使用 fgetsscanf("%[^\n]",dat.name) 甚至 gets()(我很绝望)但每次都面临同样的问题。

第一个结构的输出很好,但其余结构要么是垃圾,要么是人的姓氏,要么就是空白。

有什么想法吗?

最佳答案

当使用 scanf("%s") 读取字符串时,您正在读取第一个空白字符。这样,您的字符串就不能包含空格。您可以改用 fgets,它读取第一个换行符。

此外,为了刷新输入缓冲区,您可能需要使用例如scanf("%d\n") 而不仅仅是 scanf("%d")。否则,后续的 fgets 将采用换行符而不要求您输入。

我建议您尝试一个小程序,该程序首先读取一个整数,然后读取一个字符串。你会明白我的意思,调试起来会容易得多。如果您对此有疑问,我建议您发布一个新问题。

关于c - 带空格的字符串输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557258/

相关文章:

c - 如何在 Emu8086 中使用 'gcc' 从 .c 运行转换后的 .asm 代码

Linux - Yum 安装 GCC - 缺少内核头文件

gcc - armv7生成的ELF文件,armv6生成的.o文件,同时使用-march=armv6,为什么?

c - 如何使用 vim 获取整个项目中文本的所有引用

c - C中的指针,简单的疑惑

c++ - 我如何转发声明句柄? (Win32)

javascript - 如何像在 Python 中那样在 Google Apps 脚本中对字符串进行切片?

string - 从字符串中删除所有出现的子字符串

objective-c - #include <new> 未找到,但仅当从特定 header 引用该文件时?

python - python中打印时的字符串对齐