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

C语言实现输入字符串折行功能遇阻,求故障排查帮助

问题分析与修复方案

你的代码存在多处语法与逻辑错误,导致无法正常运行,逐个问题说明并修复如下:

1. 全局变量声明错误

extern int fnlstr_pos = 0; 用法违规:extern仅用于声明外部已定义的变量,不能同时初始化。直接改为全局变量定义即可:

int fnlstr_pos = 0;

2. 运算符优先级陷阱

while(c=getchar() != EOF) 中,!=优先级高于=,实际执行逻辑是c = (getchar() != EOF),导致c只会被赋值为0或1,而非输入的字符。修正为:

while((c=getchar()) != EOF)

3. 函数声明缺失

C语言要求函数在调用前必须声明或定义。需在main函数前添加to_printandi的函数声明,或者将函数定义移至main之前。

4. 数组越界与逻辑顺序错误

当pos + 1 >= MAXCOL时,你已将字符存入line[pos],但后续的++pos会让pos超出line数组的下标范围(line长度为MAXCOL,合法下标为0~MAXCOL-1)。需调整逻辑顺序,先判断是否需要折行,再处理字符存储与指针移动。

5. 换行符处理逻辑错误

to_printandi函数中,复制完字符后final_string[fnlstr_pos]是未赋值的内存位置,判断该位置是否为换行符完全错误。此外,当输入本身包含换行符时无需额外添加,否则会出现重复换行;仅在主动折行时需要添加换行符。

6. 未处理EOF前的剩余字符

当输入结束(遇到EOF)时,如果pos > 0,说明line数组中还有未处理的字符,需调用to_printandi完成收尾。

7. 字符串未添加终止符

C语言字符串必须以'\0'结尾,否则printf("%s")会输出乱码,需在处理完所有字符后为final_string添加终止符。


修正后的完整代码

#include <stdio.h>
#define MAXCOL 10
#define FINAL_LENGTH 300

char line[MAXCOL];
char final_string[FINAL_LENGTH];
int fnlstr_pos = 0;

// 函数声明:add_newline标记是否需要手动添加换行
void to_printandi(int pos, int add_newline);

int main() 
{
    int pos = 0;
    int c;

    while((c = getchar()) != EOF)
    {
        // 先判断是否需要折行或处理换行
        if (pos >= MAXCOL - 1 || c == '\n') {
            line[pos] = c;
            // 输入是换行则无需额外加换行,主动折行则需要
            to_printandi(pos, c != '\n');
            pos = 0;
        } else {
            line[pos] = c;
            pos++;
        }
    }

    // 处理EOF前未完成的剩余字符
    if (pos > 0) {
        to_printandi(pos - 1, 1);
    }

    // 添加字符串终止符,避免越界
    if (fnlstr_pos < FINAL_LENGTH - 1) {
        final_string[fnlstr_pos] = '\0';
    } else {
        final_string[FINAL_LENGTH - 1] = '\0';
    }

    printf("%s", final_string);
    return 0;
}

void to_printandi(int pos, int add_newline)
{
    int i;
    for(i = 0; i <= pos; ++i){
        // 检查是否超出final_string容量,避免越界
        if (fnlstr_pos >= FINAL_LENGTH - 1) {
            break;
        }
        final_string[fnlstr_pos] = line[i]; 
        fnlstr_pos++;
    }

    // 需要添加换行且还有剩余空间时执行
    if (add_newline && fnlstr_pos < FINAL_LENGTH - 1) {
        final_string[fnlstr_pos] = '\n';
        fnlstr_pos++;
    }
}

内容的提问来源于stack exchange,提问作者Me- La Ría

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:40:34