如何让C语言中fscanf()读取空白字符并存储到变量中?
解决fscanf读取含空白字符列的问题
原代码的问题出在格式串的空白处理上:%c前后的空格会让fscanf自动跳过所有空白字符(空格、换行、制表符等),导致你无法将开头的空白读取到one变量中。此外,格式串末尾的\n和空格等价,同样会跳过空白,干扰行内元素的读取。
方案1:直接修改fscanf格式串
调整格式串,去掉%c前后的多余空白,改用精确的空白跳过规则:
char one, three; char two[100]; // 先跳过所有换行符(行分隔),再读取第一个字符(含空格),然后跳过空格读取字符串,最后跳过空格读取第三个字符 while (fscanf(matrix, "%*[\n]%c%*[ ]%s%*[ ]%c", &one, two, &three) == 3) { // 处理读取到的三个元素 }
%*[\n]:跳过所有前置的换行符,避免把上一行的换行当成当前行的第一个元素%c:读取当前位置的第一个字符(包括空格),不会跳过空白%*[ ]:跳过任意数量的空格(不存储),用于分隔第一个字符和第二个字符串%s:读取非空白的字符串(自动跳过前置空白,但这里已经用%*[ ]处理了,不冲突)- 最后的
%*[ ]%c:跳过字符串和第三个字符之间的空格,读取第三个字符
方案2:用fgets+sscanf逐行处理(更可靠)
直接按行读取后再解析,避免流读取时的换行、空白干扰:
char line[256]; char one, three; char two[100]; while (fgets(line, sizeof(line), matrix) != NULL) { // 解析单行内容:读取第一个字符→跳过空格→读取字符串→跳过空格→读取第三个字符 int ret = sscanf(line, "%c%*[ \t]%s%*[ \t]%c", &one, two, &three); if (ret == 3) { // 成功读取三个元素,执行处理逻辑 } else { // 处理解析失败的情况(比如行格式错误) } }
这种方式更直观,也更容易调试每行的格式问题,适合处理按行组织的输入。
额外说明
如果第一个字段是连续的多个空白(比如第三行的两个空格),需要将所有空白存入字符串变量而非单个字符,可改用%[ ]格式:
char one[10]; sscanf(line, "%[ ]%*[ ]%s%*[ ]%c", one, two, &three);
这样one会存储开头的所有连续空格。
内容的提问来源于stack exchange,提问作者user16666341
相关产品推荐
相关产品推荐

