我正在嘗試通過兩個不同的行程(父行程和子行程)將兩個字串逐字符寫入標準輸出,強制使用 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 轉義碼來為第一個字串結束的第二個字串準備好游標,但是如何將它們集成到 write() 內的緩沖區中?
現在,使用上述代碼,我可以獲得以下輸出:
String1:
Hyper
String2:
loop
Hyper
loop
我想獲得:
String1:
Hyper
String2:
loop
Hyperloop
先感謝您
uj5u.com熱心網友回復:
@chux 已經解決了主要問題。這是具有以下其他更改的相應作業代碼:
- 區域或消除的變數
- 添加缺少的包含以使其在 Linux 上編譯
- 用
write
sleep替換每個字符,write
整個字串只有一個。 - 防止緩沖區溢位
- 定義 LEN 而不是行內魔法值
#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);
}
這是輸出(注意最后一行之后沒有換行符):
String1:
Hyper
String2:
loop
Hyperloop
不知道為什么一次列印一封信,但更好的選擇是printf("%s", buf)
(但是是buf1
或buf2
)。
uj5u.com熱心網友回復:
我想我已經找到了解決辦法。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);
}
非常感謝幫助者!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/374138.html
上一篇:巧妙地替換字串
下一篇:為什么我在我的代碼中的執行緒“main”java.lang.StringIndexOutOfBoundsException中收到例外?