我必须从用户那里获取输入,将其放入管道(在父进程中)然后我必须处理子进程中的字符串。所有大写字母都必须为小写,所有小写字母必须为大写。我的问题是管道的输出。我的代码只会改变字符串中第一个字符的字母大小写,我不知道为什么。子管道正在读取所有字符(至少看起来像是)。我希望有人可以告诉我为什么这不会处理每个角色。
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));
答案 0 :(得分:0)
你犯了两个常见的错误。
(1)read
不会为您缓冲,因此您无法保证获得len个字节(例如,在您的情况下为.strlen(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);
}