2013-06-25 188 views
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)); 

回答

0

你做两个常见的错误。

(1)read不会为您缓冲,所以您不能保证获得len字节(即在您的情况下为strtrlen(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); 
} 
+0

是有道理的,但BUF被定义为char BUF;它不是一个数组或指针。 –

+0

也,我只是改变了buf的定义是一个数组,它完美的作品。希望我没有被告知它必须是单个字符而不是数组! –

+0

那么如果你真的需要读入一个字节,那么你原来应该工作。您只需将其更改为每次读取一个字节而不是strlen(cmd)字节。但说实话,这是有点明智的效率。 – Duck