用户从c中读取字符

时间:2017-11-12 19:58:17

标签: c scanf

我正在尝试在C中构建一个小型的第一个项目。我想在列表中构建一个待办事项列表,我正在使用它,比如

struct tasks{
  int id;
  char desc[150];
}task[100];

我已经定义了最大数量。任务为100,描述最多可以包含150个字符。

然而,在创建新任务时,我甚至无法在程序运行期间暂时存储完整的句子,因为在空间C认为已完成之后;所需要的只是句子的第一个单词。

我尝试了gets()getchar()之类的不同内容,但在结构中使用时未能实现它。

有人能指出我正确的方向,我可以创建一个创建函数,它可以将整个句子作为用户的输入,而不仅仅是一个单词。

编辑1:

所以我尝试了fgets()和正确编译的程序,没有错误但是没有正常运行。

void create(){
printf("Enter task description"):
fgets(task[i].desc,150,stdin);
printf("%s\n", task[i].desc ); //to check what's going on and all i get is blank space
printf("Task successfully created.\n\n");
}

和int id部分是程序的第二部分,我希望默认情况下将uid与每个任务相关联,并附上时间戳。

2 个答案:

答案 0 :(得分:0)

对初学者来说容易忽视:变量“i”是否定义良好,或者它是否会“缓冲溢出”你的数组?

传入“i”作为create()的参数将是要走的路:

void create(int i){...}

默认情况下,堆栈变量不会归零,因此会继承已存在的任何值。

答案 1 :(得分:0)

所以我可以通过@david给出的答案将整个句子作为输入,如下面的代码所示:

void create(int i){
printf("Enter task description:\n");
fgets(task[i].desc,150,stdin);
fflush(stdin);
fgets(task[i].desc,150,stdin);
printf("%s\n", task[i].desc );
printf("Task successfully created.\n");
}

但单独的fgets是不够的,因为只有一个fgets功能控制台没有接受任何输入,而是我得到的只是一个空行。但是添加fflush(stdin)然后再添加另一个fgets就可以了。