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

你犯了两个常见的错误。

(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 回答