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

C语言通过父子进程调用write()输出到stdout实现两个字符串拼接

实现方案

问题根因

你现有代码的问题来自两个细节:

  • read()函数读取标准输入时,会把你输入结束按下的回车对应的\n字符一起存入缓冲区,因此buf1末尾自带换行符,子进程输出完buf1就会自动换行,导致父进程后续输出的buf2落到下一行
  • read()不会自动给读取的内容追加字符串结束符\0,你直接调用strlen()读取缓冲区长度存在未定义行为风险

修改后代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h> // 补充wait函数需要的头文件

char buf1[100];
char buf2[100];
int i;

pid_t t;

int main()
{
    ssize_t read_len; // 存储read实际读取的字节数
    printf("String1:\n");
    read_len = read(0, buf1, 99); // 留1个位置放结束符
    if (read_len > 0 && buf1[read_len-1] == '\n') {
        buf1[read_len-1] = '\0'; // 把末尾的换行替换成结束符
    } else {
        buf1[read_len] = '\0'; // 没有换行的话直接加结束符
    }
    
    printf("String2:\n");
    read_len = read(0, buf2, 99);
    if (read_len > 0 && buf2[read_len-1] == '\n') {
        buf2[read_len-1] = '\0';
    } else {
        buf2[read_len] = '\0';
    }
    
    t = fork();
    
    if (t > 0) {
        wait(NULL);
        for (i = 0; i < strlen(buf2); i++) {
            write(1, &buf2[i], 1);
            sleep(1);
        }
        write(1, "\n", 1); // 最后补一个换行,让提示符位置正常
    }
    else {
        for (i = 0; i < strlen(buf1); i++) {
            write(1, &buf1[i], 1);
            sleep(1);
        }
        exit(0);
    }
    return(0);
}

核心修改说明

  • 新增逻辑处理read()的返回结果,将输入末尾的换行符替换为字符串结束符\0,既保证strlen()能正确计算长度,也消除了多余的换行输出
  • 补充了sys/wait.h头文件,避免部分编译器下wait()函数未声明的报错
  • 输出完全结束后追加1个换行,避免终端提示符直接跟在输出字符串末尾

内容的提问来源于stack exchange,提问作者The_Student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:03:00