c语言字符串怎么输入|scanf搭配数组是入门常用写法

c语言字符串怎么输入|scanf搭配数组是入门常用写法

上周熬夜改课程作业的时候,卡在c语言字符串怎么输入这块,对着编译器反复敲代码,连着两三个小时跑出来的结果全是乱码,同宿舍趴在桌边敲代码的同学时不时瞟过来,随口丢过来一句别死磕单一输入函数,可手边课本只笼统写了输入语句,压根没细分不同场景该选用哪段代码,就是凭着自己零散的记忆瞎改参数,越调试心里越发烦躁。

随便建了个char类型数组,长度随手填了十,直接套用scanf("%s",字符数组名),运行测试输入带空格的短句,回车之后控制台只收录了空格前面的字符,后半段文字直接凭空消失,当时以为是数组空间给小了,反复把数组数值从十改到五十,重复编译运行五六回,问题照旧,折腾大半天才察觉问题不在数组长度,而是%s本身就以空格、换行当作录入结束的标记,但凡碰到空白字符就直接截断输入内容。

转头翻起课上潦草记的笔记。

笔记边角歪歪扭扭记了gets,照着代码敲完编译,编译器弹出警示弹窗,才知道新版本编译器已经淘汰这个函数,没法正常编译运行,那会懒得去查淘汰缘由,索性直接搁置这个思路,不再琢磨gets相关的编写方式,转而去找别的可行输入写法,反正课本里能找到的基础函数也就寥寥几个,挨个试错也花不了太久。

抱着试一试的心思换成fgets函数,参数填好数组名称、数组容量和标准输入,单次输入带空格的整段文字,程序可以完整接收全部内容,可新的麻烦跟着冒出来,fgets会连带回车换行符一并存入字符串里面,后续做字符串拼接或者长度计算的时候,多出的换行符号频繁打乱运算结果,那段时间改项目里的字符串处理模块,大半时间都在手动剔除多余的换行字符,试过在输入结束后用循环遍历数组逐个删去\n,也试过借助字符串截取函数精简内容,两种操作各有繁琐之处,没有哪个能做到一步到位直接处理干净,往往改完一处细节又会衍生出新的小漏洞,耗费不少课余空闲。

隔壁桌的同班同学刚好在做一模一样的练习题,他习惯自定义输入循环,利用getchar逐个接收单个字符,判断读到回车就终止录入,这种写法不受空格限制,还不会自动收纳换行符,只是代码行数要比现成库函数多出不少,写起来耗时更长,课堂小作业赶截止日期的时候很少有人愿意选用这种手动封装的模式,多数人为了省事优先选用库函数完成字符串录入,觉得多余的代码会拖慢敲题速度。

后来才反应过来,scanf不是不能处理空格,只是原有格式符的书写形式受限,改用%[^\n]的格式配置之后,scanf也能读取包含空格的完整内容,只是这个格式写法冷门,课本基础章节基本不会详细讲解,不加留意很容易忽略这个用法,而且该写法同样藏着缓冲区遗留字符的隐患,连续多次调用输入语句的时候,残留的换行容易干扰下一轮字符串读取,需要额外清空缓冲区才能稳定运行。

之后接连两三天的课余空档,断断续续把三种常用输入方式分开测试,每种写法各自记在草稿纸上面,区分清楚适用场景,短内容无空格就用基础scanf,带空格的长文本优先fgets或者改造格式的scanf,追求极致可控就手写循环搭配getchar,没有能适配所有场景的万能输入代码,只能跟着需求灵活调换,没有一成不变的标准答案。

收拾桌面的时候,草稿纸混在一堆废弃代码纸里被随手塞进抽屉,之后再碰到同类编程题目,照旧偶尔记错格式写错参数。

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