You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个显示宽度计数,只需新增物理行统计逻辑即可:

  1. 新增两个变量:int curr_line_width = 0 统计当前行已用显示宽度,int phy_lines = 0 统计物理行数
  2. 每次计算字符宽度时同步更新curr_line_width:
    • 读到\n时,物理行数+1,重置curr_line_width为0
    • 读到\t时,curr_line_width +=4
    • 其他字符时,curr_line_width +=1
  3. 每次更新完curr_line_width后判断:如果curr_line_width >= 160,物理行数+1,同时curr_line_width -= 160(超出部分属于新行的宽度)
  4. 输入结束后,如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:36:04