簡體   English   中英

使用 write() 將兩個字符串連接到 C 中的標准輸出

[英]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 已經解決了主要問題。 這是具有以下其他更改的相應工作代碼:

  1. 局部變量或消除變量
  2. 添加了缺少的包含以使其在 Linux 上編譯
  3. 將每個字符的write替換為睡眠,整個字符串只需一次write
  4. 防止緩沖區溢出
  5. 定義 LEN 而不是內聯魔法值,也使用 STDOUT_FILENO
#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) (但它是buf1buf2 )。

我想我找到了解決辦法。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM