为 C 读取用户输入字符串的最佳方法? [复制]

Posted

技术标签:

【中文标题】为 C 读取用户输入字符串的最佳方法? [复制]【英文标题】:Best way to read a user input string for C? [duplicate] 【发布时间】:2020-01-29 23:51:13 【问题描述】:

我知道 fgets() 和 gets(),但有人告诉我这两个函数已弃用,所以我宁愿使用其他函数。我使用了scanf,但我遇到的问题是扫描在遇到空格后停止读取,因此如果我输入名字和姓氏,那么它只会返回第一个字符串。这是我使用 scanf 进行用户输入的原始代码,但我意识到如果用户有三个字符串,如 John Doe Smith,那么它只会读取 John Doe。

char firstName[100], lastName[100];
printf("Please enter your first and last name: \n");
scanf("%s%s", firstName, lastName);

这会返回正确的想法,但前提是用户输入两个字符串,例如 John Doe。

从学期开始,我想保持代码简单,不要涉及任何其他看起来太多用不起来的功能。

【问题讨论】:

远未弃用fgets() 非常有用。但是 gets() 不再是有效的 C 函数。您的scanf 不适用于两个字的名字或姓氏,例如“Betty Jo Davis”或“Pete Da Silva”,因为%s 格式说明符将在第一个空白字符处停止扫描。但它应该适用于两个词,例如名称“John Smith”。 这是微软的“安全”理念吗?没有 C 代码是安全的,除了进一步混淆之外,MS 几乎没有做任何事情。正确使用 C 是安全的。 MS 会带你走上花园的小路——远离标准 C。他们以为自己在调调,但他们自己却忽略了 C 标准。 请注意,用户输入从来都不是简单的,通常是程序中最棘手的部分。 @WeatherVane "MS 将带你走上花园之路——远离标准 C" --> 听起来像是他们的营销策略 Embrace, extend, and extinguish 【参考方案1】:

fgets() 是从标准输入读取的首选 C 标准方式。只要你传入的缓冲区是属于你的有效内存,并且传入的长度等于或小于缓冲区的大小,就是安全的。

可以使用更复杂的用户输入库,例如 Gnu Readline,但如果您只是学习该语言,请坚持使用 fgets() 等标准。

【讨论】:

fgets() 是最标准的函数吗?我看到它涉及指针,我们还没有完全解决这个问题。不知道还有没有其他标准功能。我认为 fgets() 是我现在最好的选择。 最终你会得到read()fread() 之类的东西,但是作为fgets() 开始使用它们并不简单。缓冲区参数不必是指针——它可以是一个数组(例如char buf[80]; fgets(buf, sizeof buf, stdin);.

以上是关于为 C 读取用户输入字符串的最佳方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将数字转换为字符串的最佳方法? [复制]

在 C 中将字符串数组转换为 Int 数组的最佳方法

请帮忙用C语言编写一个函数~~~功能是“文件复制”~~~谢谢~~

用C语言截取字符串

在 MySQL 中转义用户输入正则表达式的最佳方法是啥?

将json字符串转换为对象数组的最佳方法是啥? [复制]