为 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 读取用户输入字符串的最佳方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章