[英]Concatenate two strings using write() to stdout in C
我試圖通過兩個不同的進程(父親和孩子)將兩個字符串逐個字符地寫入標准輸出,強制使用 read() 和 write(),代碼如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
char buf1[100];
char buf2[100];
int i;
pid_t t;
int main()
{
printf("String1:\n");
read(0, buf1, 100);
printf("String2:\n");
read(0, buf2, 100);
t = fork();
if (t > 0) {
wait(NULL);
for (i = 0; i < strlen(buf2); i++) {
write(1, &buf2[i], 1);
sleep(1);
}
}
else {
for (i = 0; i < strlen(buf1); i++) {
write(1, &buf1[i], 1);
sleep(1);
}
exit(0);
}
return(0);
}
我設法讓兩個進程分別將一個字符串寫入標准輸出,但我未能將這兩個字符串合並為一個。 我嘗試使用 ANSI 轉義碼讓 cursor 為第一個字符串結束的第二個字符串做好准備,但我如何將它們集成到 write() 內的緩沖區中?
現在,通過上面提到的代碼,我可以得到這個 output:
String1:
Hyper
String2:
loop
Hyper
loop
我想獲得:
String1:
Hyper
String2:
loop
Hyperloop
先感謝您
@chux 已經解決了主要問題。 這是具有以下其他更改的相應工作代碼:
write
替換為睡眠,整個字符串只需一次write
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define LEN 99
#define str(s) xstr(s)
#define xstr(s) #s
int main() {
char buf1[LEN+1];
char buf2[LEN+1];
printf("String1:\n");
scanf("%" str(LEN) "s", buf1);
printf("String2:\n");
scanf("%" str(LEN) "s", buf2);
if (fork() > 0) {
wait(NULL);
write(STDOUT_FILENO, buf2, strlen(buf2));
} else {
write(STDOUT_FILENO, buf1, strlen(buf1));
exit(0);
}
return(0);
}
這是 output (注意最后一行后沒有換行符):
String1:
Hyper
String2:
loop
Hyperloop
不知道為什么你一次打印一個字母,但更好的選擇就是printf("%s", buf)
(但它是buf1
或buf2
)。
我想我找到了解決辦法。 read() 讀取或 write() 寫入的最后一個字節對應於換行符。 因此,寫入第一個緩沖區的所有字節,但其中一個對於獲得我想要的結果至關重要。 這樣,第一個緩沖區的 for 循環將如下所示:
for (i = 0; i < strlen(buf1)-1; i++) {
write(1, &buf1[i], 1);
sleep(1);
}
並且是這樣的完整代碼:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
char buf1[100];
char buf2[100];
int i;
pid_t t;
int main()
{
printf("String1:\n");
read(0, buf1, 100);
printf("String2:\n");
read(0, buf2, 100);
t = fork();
if (t > 0) {
wait(NULL);
for (i = 0; i < strlen(buf2); i++) {
write(1, &buf2[i], 1);
sleep(1);
}
}
else {
for (i = 0; i < strlen(buf1)-1; i++) {
write(1, &buf1[i], 1);
sleep(1);
}
exit(0);
}
return(0);
}
非常感謝幫助者!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.