c - 无法运行一段代码以从 C 中的用户获取不同类型的数据
问题描述
这个问题可能看起来很愚蠢,但我不习惯使用 C,而且我在这里发疯了,不知道哪里出了问题。
基本上我想要的是从用户那里得到一个数字,然后是一个字符串,用户可以写任何他喜欢的东西,我只想保留那个字符串的第一个字符。
我的代码如下:
#include <stdio.h>
int main()
{
int b, n;
char frase [2];
scanf("%d", &n);
fgets(frase, 2, stdin);
puts(frase);
return 0;
}
我的问题是,fgets
程序停止后,无论我有什么,它只会停止,没有错误消息或任何东西。怎么了?
解决方案
怎么了?
您的代码将:
对于输入
123 abc
:- 存储
123
在n
,存储空间frase
后跟一个空字节。然后它将打印该单个空格并结束其执行而没有错误。
- 存储
对于输入
123
Enterabc
:- 存储并存储在
123
您按下时添加到缓冲区的换行符,然后是一个空字节,接下来它将打印并结束其执行而没有错误。n
frase
\n
Enter\n
- 存储并存储在
所以它不只是停止,它会做它应该做的事情。
为了使您的代码更健壮,您应该做的是还用 解析数字,并用orfgets
转换它:sscanf
strtol
int n = 0;
char buffer[20];
char frase[2];
fgets(buffer, sizeof buffer, stdin);
if(sscanf(buffer, "%d", &n) != 1){
//value not parsed
}
fgets(frase, sizeof frase, stdin);
puts(frase);
使用scanf
解析输入很少,如果有的话,是一个好主意。
推荐阅读
- php - Laravel Eloquent 部分不区分大小写的按术语搜索
- c - 为什么 LIBRARY_PATH 变量冗余地使用“/../../”来定位某些目录?
- sql - 如何使用 CLOB 数据类型的列中的 SQL 解析和显示数据
- python - 复杂类层次结构的输入提示
- flask - 在整个应用程序中扩展 context_processor(包括蓝图)
- javascript - HTML单选按钮在数据库中保存第一个单选按钮值
- java - 无法将 springboot REST api 部署到 Heroku
- neo4j - 在 Neo4J 中查找图中节点之间的长度(最远)
- arrays - 谷歌表格 IF 函数返回值
- c++ - 如何在 omnet++ 中将 simtime 转换为双值?