0

ユーザーから入力を取得し、それを(親プロセスの)パイプに入れてから、子プロセスで文字列を処理する必要があります。大文字はすべて小文字にする必要があり、小文字はすべて大文字にする必要があります。私の問題は、パイプの出力にあります。私のコードは、文字列の最初の文字の大文字と小文字のみを変更しますが、その理由はわかりません。子パイプはすべての文字を読み取っています (少なくともそうであるように見えます)。これが各文字を処理しない理由を誰かが教えてくれることを望んでいました。

while (read(pfd[0], &buf, strlen(cmd)) > 0){
    if(buf >= 'a' && buf <= 'z'){
        buf = toupper(buf);
    }
    else{
        buf = tolower(buf);
    }
}

write(STDOUT_FILENO, &buf, strlen(cmd));
4

1 に答える 1

0

あなたは2つのよくある間違いを犯しています。

(1)readはバッファリングしないため、len バイト (この場合は iestrlen(cmd)) を取得できる保証はありません。 指定した長さまでread利用可能なバイト数を返しますが、それよりも少ないバイト数を返すことができ、多くの場合、返されます。したがって、それを反映するように読み取りループを変更する必要があります。

(2) buf はおそらく char 配列です。常に最初のバイトと最初のバイトのみを変更しています。読み取ったすべてのバイトを反復処理する必要があります。

すべてをまとめると、次のようになります

while ((bytesread = read(pfd[0], &buf, strlen(cmd))) > 0)
{
    for (int i = 0; i < bytesread; ++i)
    {
        if(buf[i] >= 'a' && buf[i] <= 'z')
            buf[i] = toupper(buf[i]);
        else
            buf[i] = tolower(buf[i]);              
    }

    write(STDOUT_FILENO, &buf, bytesread);
}
于 2013-06-26T00:58:30.847 に答える