c - fgets 不接受最后一个值?
问题描述
我有一个家庭作业问题:-
1)用户将输入他想输入的名字的数量。
2) 然后他会输入这些名字。
3)我们必须打印这些名字。
这是我为上述问题编写的代码:-
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
int main()
{
int n; // number of names user wants to input.
scanf("%d", &n);
char *array[n]; //creating an array of pointers.
int i;
for(i = 0; i < n; i++)
{
array[i] = malloc(21*sizeof(char)); // allocating memory to each pointer.
}
for(i = 0; i < n; i++)
{
fgets(array[i], 21, stdin); //getting the values.
}
for(i = 0; i < n; i++)
{
printf("%s", array[i]); // printing those values.
}
return 0;
}
上面代码的问题是它没有打印用户输入的最后一个值。
示例:示例输入:-
5
raj
chris
ben
abhay
gautam
预期输出:-
raj
chris
ben
abhay
gautam
我的输出: -
raj
chris
ben
abhay
编辑:
更改此行后: -
scanf("%d", &n);
至
scanf("%d ", &n);
它工作正常。
解决方案
第scanf("%d", &n);
一个在输入流中留下一个换行符,因此您读取的第一个字符串fgets
只是一个换行符。在阅读名称之前,您需要删除该换行符。
如果你改变
for(i = 0; i < n; i++)
{
printf("%s", array[i]); // printing those values.
}
至
for(i = 0; i < n; i++)
{
printf("String %d : |%s|", i, array[i]); // printing those values.
}
很容易看到...
你会得到输出:
String 0 : |
|String 1 : |raj
|String 2 : |chris
|String 3 : |ben
|String 4 : |abhay
|
注意第一个字符串只是一个换行符......
我通常的建议是......不要使用scanf
(用于读取数字)。这似乎是一个非常简单的功能,但它真的很难使用并且会导致很多错误。而是使用fgets
后跟sscanf
. 此外,您应该检查sscanf
/scanf
实际返回 1。
推荐阅读
- c# - 我想在组合框中显示所有 sql 名称表
- java - Integer.valueOf() 混淆
- python - 在python中开发一个打印网格的函数
- python - 在线程的整个生命周期中使用 id(threading.current_thread()) 作为线程标识符可以吗?
- javascript - ParseInt 丢弃数字
- node.js - 如何向 socketIO 添加请求和响应
- unix - 在连接 UNIX 套接字端之前打开 socat 连接的 TCP 端
- c - 为什么 OpenMP 不能加速我的 C 程序?
- java - 在 Netbeans 中解析 JSON 数据时遇到问题
- html - flex-grow 不起作用,我做错了什么?