【问题标题】:What happens when a scanf("%s",s); encounters two or more words and only one variable is provided?当 scanf("%s",s);遇到两个或多个单词并且只提供一个变量?
【发布时间】:2015-02-19 17:02:27
【问题描述】:

scanf("%s",s);(获取不完美字符串的多种方法之一)在输入中遇到空格时,它会尝试将其放入另一个变量中,对吗?但是,如果在这种情况下只提供一个变量会发生什么?

还有什么其他方法可以输入字符串?哪个是最简单或最好的,哪个不会像gets(s); 函数那样出现问题?

这是我现在的s_insert 函数:

// pointer to pointer needed when you allocate memory in the function
void s_insert(char **string_one){   //inserts string (loss of original data)
    *string_one=(char*)malloc(200);
    fgets (*string_one,200,stdin);
} 

【问题讨论】:

  • 您当前的函数实现不起作用并且它还会泄漏内存。
  • @TheParamagneticCroissant 缺乏记忆是什么意思?为什么它不能这样工作?
  • 当您更改问题时,请尝试在编辑副标题后添加新信息而不更改问题的原始文本(这只是对未来的建议)
  • 查看cplusplus.com/reference/cstdlib/malloc 的示例,了解如何确保成功分配字符串的内存。
  • 我应该如何调用新函数?我以前用过s_insert(string);,但现在已经不行了!

标签: c string


【解决方案1】:

scanf for %s 数据规范读取第一个空格符号(''、'\n' 或 '\t')之前的字符。如果你想读取带空格的字符串(超过两个单词)使用fgets函数,这比'gets'更安全,因为你可以设置内存中可以分配的最大字符数并避免分段错误。

【讨论】:

  • 我知道它的作用,我只想知道输入的其余部分发生了什么,例如当我输入hello worldworld 发生了什么
  • @CoderGuy 它保留在输入流中。
  • ... 并且可以被下一个scanf 读取(或被fflush(stdin) 杀死)
  • 这对我的程序有什么影响,它会一直呆在那里直到我询问另一个输入,它会被覆盖吗?
  • 如何使用fgets()函数?
【解决方案2】:

不,它只会在第一个参数中遇到带有合适转换说明符的% 时尝试“放入变量”。该参数控制其行为,而不是输入。

在输入中有一个%s 和多个单词只会将剩余的单词留在输入缓冲区中,因为scanf() 将在使用单个%s 完成时停止,所以它没有更多的事情可做.

它读取其转换规范字符串并尝试读取输入以匹配该字符串,而不是相反。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2018-07-30
    • 1970-01-01
    • 2021-06-07
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    相关资源
    最近更新 更多