如何用scanf读取含空格换行的N字符?多段读取指定字节异常排查
用scanf读取含空格/换行的最多N字符并生成以\0结尾的字符串
可行方案
%c格式符确实不会自动添加字符串终止符,所以手动在读取的字符后补\0就能解决问题。比如要读取最多4个字符,数组得预留至少5个位置(4个数据位+1个终止符位),修改代码如下:
char s[5]; // 4个数据位 + 1个\0的位置 int read_count; while ((read_count = scanf("%4c", s)) != EOF) { s[read_count] = '\0'; // 手动给读取到的字符加终止符 printf("%s", s); }
输入1234567890时,第一次读取1234后补\0输出,第二次读取5678补\0输出,第三次读取剩余的90补\0输出,最终会正确输出1234567890。
你尝试的其他方法失效原因
"%4s":s格式符会自动跳过前导空白,然后读取到下一个空白字符就停止,无法包含空格、换行这类空白字符,不符合需求。"%4[^\n]"和fgets:前者会读取到换行符为止,后者默认也是读取到换行或EOF,都做不到跨换行读取固定长度的内容,满足不了“每次读N字节”的要求。"%4[^\0]":输入流里不会常规出现\0字符(除非手动构造),[]格式符匹配的是输入中的可见字符,所以这个规则没有实际意义,格式无效。"%4[]":[]格式符要求内部必须有匹配规则(要么指定字符集,要么用^排除字符),空的[]是非法格式,无法被scanf识别。"%4":这是不完整的格式说明符,scanf无法解析,自然不能正常工作。
内容的提问来源于stack exchange,提问作者Timofey X
相关产品推荐
相关产品推荐

