C语言运行环境行满自动换行是否会添加\n?如何统计该类行数?
#include <stdio.h> #include <ctype.h> // for isspace() #include <stdbool.h> // for bool, true, false #define STOP '|' int main(void) { char c; // read in character char prev; // previous character read long n_chars = 0L; // number of characters int n_lines = 0; // number of lines int n_words = 0; // number of words int p_lines = 0; // number of partial lines bool inword = false; // == true if c is in a word printf("Enter text to be analyzed (| to terminate):\n"); prev = '\n'; // used to identify complete lines while ((c = getchar()) != STOP) { if (c == '\n') // n_lines++; // count lines else if (c == '\t') n_chars+=4; else n_chars++; if (!isspace(c)&&c>='a'&&c<='z'&& !inword) { inword = true; // starting a new word n_words++; // count word } if (isspace(c) && inword) // inword = false; // reached end of word prev = c; // save character value } if (prev != '\n') p_lines = 1; printf("characters = %ld, words = %d, lines = %d, ", n_chars, n_words, n_lines); printf("partial lines = %d\n", p_lines); return 0; } // end of main
自动换行是否会插入\n字符
不会。你观察到的自动换行是终端的显示逻辑,仅负责将超出单行宽度的内容渲染到下一行,不会修改程序实际接收到的输入流,也不会额外插入\n字符。你现有代码统计的是用户主动输入回车产生的逻辑行数,和终端显示的物理行数属于两个不同的统计维度。
统计自动换行产生的物理行数的方法
已知你的环境单行最大显示宽度为160字符,且你已将\t按4个显示宽度计数,只需新增物理行统计逻辑即可:
- 新增两个变量:
int curr_line_width = 0统计当前行已用显示宽度,int phy_lines = 0统计物理行数 - 每次计算字符宽度时同步更新
curr_line_width:- 读到
\n时,物理行数+1,重置curr_line_width为0 - 读到
\t时,curr_line_width +=4 - 其他字符时,
curr_line_width +=1
- 读到
- 每次更新完
curr_line_width后判断:如果curr_line_width >= 160,物理行数+1,同时curr_line_width -= 160(超出部分属于新行的宽度) - 输入结束后,如果
curr_line_width > 0,物理行数再+1,统计最后一段不满160字符的行
核心修改后的代码片段如下:
#define MAX_LINE_WIDTH 160 // 变量定义部分新增 int curr_line_width = 0; int phy_lines = 0; while ((c = getchar()) != STOP) { int char_width = 0; if (c == '\n') { n_lines++; phy_lines++; curr_line_width = 0; } else if (c == '\t') { char_width = 4; n_chars += char_width; curr_line_width += char_width; } else { char_width = 1; n_chars += char_width; curr_line_width += char_width; } // 处理自动换行 while (curr_line_width >= MAX_LINE_WIDTH) { phy_lines++; curr_line_width -= MAX_LINE_WIDTH; } // 原有单词统计逻辑不变 if (!isspace(c)&&c>='a'&&c<='z'&& !inword) { inword = true; n_words++; } if (isspace(c) && inword) inword = false; prev = c; } // 处理最后一行不满的情况 if (curr_line_width > 0) { phy_lines++; } if (prev != '\n') p_lines = 1; // 输出时新增物理行的打印即可
内容的提问来源于stack exchange,提问作者tree
相关产品推荐
相关产品推荐

