c语言字符串怎么输入|scanf搭配字符数组完成常规字符串录入

c语言字符串怎么输入|scanf搭配字符数组完成常规字符串录入

当初对着编译器反复调试c语言字符串怎么输入,盯着黑框控制台敲代码熬了半个晚自习,随手敲下scanf("%s",str)之后,满心以为随便输入带空格的短句都能完整存进数组,运行弹窗输了“春日 晚风”,回车之后控制台只截取了春日两个字,剩下的字符凭空留在缓冲区里,变量压根读取不到后半段内容,敲回车反复重试三四遍,每次空格之后的内容全数丢失,手边摊着的课本边角被指尖搓得起毛,就是没琢磨明白空格为什么会打断录入逻辑。

一开始固执的认定是数组开的空间不够。

索性把字符数组的长度从二十改成一百,觉得扩容之后总能收纳带空格的文本,重新编译运行之后,照旧在空格位置截断录入内容,对着屏幕来回拖动光标,一会怀疑符号写错,一会又在琢磨格式控制符那是不是少打了特殊标记,在草稿纸上密密麻麻罗列十几种修改写法,一会替换双引号的位置,一会额外添加取地址符&,忘了字符串数组名本身就是首地址,胡乱在str前面加上&符号,编译器直接跳出报错弹窗,红色报错文字铺满下方提示栏,折腾近一个小时,手边的草稿纸写满凌乱代码,笔尖在纸面上戳出好几个小凹点,依旧没能解决空格中断输入的麻烦,那会儿压根想不到问题根源不在数组大小,而是scanf本身的读取规则碰到空白字符就终止接收。

同宿舍学编程的室友凑过来瞟了一眼代码,随口提了一句另外一种输入写法,他平常偏爱用gets函数接收整行内容,试过之后确实能正常录入包含空格的句子,只是后来查资料才知晓这个函数存在缓冲区溢出的隐患,现在多数新版编译环境已经不再支持原生gets调用,换成学校机房的高版本编译器直接编译就会弹出警告提示,没法稳定运行在不同设备上面,再往后写作业便慢慢舍弃了这个便捷但不安全的写法。

其实还有偶然一次实训课,老师演示fgets做字符串录入,课堂上跟着敲完代码,发现这个函数既能收纳空格,还能限制单次读取的字符数量,刚好规避掉数组越界的问题,只是它会顺带把回车换行符一并存入字符数组里,后续需要手动把末尾的\n替换成结束符\0,多出来一步额外的处理工序,刚上手的时候总忘记剔除换行符号,输出内容末尾莫名多出空行,反复删减代码行才能修正这类细碎的小问题。

偶尔偷懒混用不同输入函数,缓冲区残留数据会错乱。

上次写简易记事本小程序,前面用scanf接收用户选择菜单的数字,紧接着调用fgets录入字符串,运行之后还没等手动输入文字,程序直接跳过输入步骤,自动读取缓冲区遗留的回车空字符,变量直接存进无效换行,反复拆分两段代码分开测试,单独运行录入代码一切正常,拼接在一起就出问题,后来才反应过来是前一次输入留下的换行滞留在输入流里面,挤占了后续字符串的录入位置,想要修正就得在两次输入中间加清理缓冲区的相关语句,那段时间为了规避这个隐性问题,写代码时总习惯性在切换输入函数之后补一段清空缓存的代码,好几次赶作业赶急了漏掉这段内容,程序照旧跳出反常的运行效果。

日常练习短字符串不带空格的录入,沿用最初的scanf写法完全够用,不用额外处理多余符号,代码精简省事,就是局限没办法处理空格文本,没有万能的输入写法,只能按照实际需要挑选对应的函数,碰到无空格短句选scanf,整行带空格文本优先选用fgets,再没有别的折中方案。

熄灯之后趴在床铺,手里攥着写满代码的草稿纸,随手把出错频次最高的几行写法圈了出来。

了解更多百科知识请访问 百科