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
相关产品推荐
相关产品推荐

