2013-06-25 2 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-байтов (в нашем случае - i.e.strlen (cmd).). read вернет любое количество байтов, которое у него есть до указанную вами длину, но она может и часто будет возвращать меньше. Поэтому вы хотите изменить свой цикл чтения, чтобы это отразить.

(2) buf предположительно является массивом символов. Вы всегда меняете первый байт и только первый байт. Вам нужно повторить все прочитанные байты.

Так положить все это вместе, что-то вроде

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; это не массив или указатель. –

+0

также, я просто изменил определение buf как массив, и все это работает отлично. Надеюсь, мне не сказали, что это должен быть единственный символ, а не массив! –

+0

Ну, если вам действительно нужно прочитать в один байт, то то, что вы изначально должны были работать, должно работать. Все, что вам нужно сделать, это изменить его на чтение байта на чтение, а не на strlen (cmd). Но, честно говоря, это немного разумно. – Duck