doublench21
@doublench21

Считывание строки определенной длины в цикле без лишнего?

Как бы я не пытался считать строку в массив скажем char[32] в цикле и тут же выводя, всё бы ничего, до тех пор пока не превысила строка заданные размеры. И буффер чистил и fgets пробовал - ничего. Без цикла как надо, в цикле - бред.
  • Вопрос задан
  • 2645 просмотров
Пригласить эксперта
Ответы на вопрос 6
Не совсем понятен вопрос, а без исходного кода ещё больше непонятно.

В конце строки, считываемой посимвольно, после записи в массив нужно добавлять символ конца строки '\0' . Так например можно 30-ый символ записывать, потом принудительно 31-ым ставить '\0' и дальше говорить что всё, места нет.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
@Doublench21 вы предыдущие ответы на свои вопросы принципиально не читаете?
Вот здесь я вам написал, что можно использовать fflush(stdin)
Ответ написан
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Покажите исходный текст, это разю
В C++ для ввода существует cin, это два.
Не забывыйте, что для строки в 32 символа нужен массив на 33 символа.
Ответ написан
doublench21
@doublench21 Автор вопроса
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    int fd[2], fork_status1, fork_status2;
    char buff[20], str_[32];


    if(pipe(fd) == -1) {
        fprintf(stderr, "pipe - error!\n");
        exit(-1);
    } else {
        fork_status1 = fork();
        if(fork_status1 == -1) {
            fprintf(stderr, "fork1 - error!\n");
            exit(-2);
        } else if(fork_status1 == 0) {
            fork_status2 = fork();

            if(fork_status2 == -1) {
                fprintf(stderr, "fork2 - error!\n");
                exit(-2);
            } else if(fork_status2 == 0) { // Child process(2)
                printf("Write smth(2)...\n");
                while(strcmp(str_, "exit")) {
                    fgets(str_, 30, stdin);
                    write(fd[1], str_, strlen(str_));
                }
                exit(0);
            } else { // Child process(1)
                printf("Write smth(1)...\n");
                while(strcmp(str_, "exit")) {
                    fgets(str_, 30, stdin);
                    printf("%s", str_);  //<-----------------------------------
                    write(fd[1], str_, strlen(str_));
                }
                exit(0);
            }

        } else { // Parent process
            while(strcmp(buff, "exit")) {
                read(fd[0], buff, strlen(str_));
                if(strcmp(buff, "exit")) {
                    //printf("%s\n", buff);
                }
            }
            close(fd[0]);
            close(fd[1]);
            exit(0);
        }
    }


    return 0;
}
Ответ написан
Комментировать
@iwanerhov
Программист С/C++
Я что-то не сильно понял, но такие вещи как std::string никто не отменял. С ними вы никогда не выйдите за границу массива и не обвалите кучу :D
Ответ написан
Комментировать
@che2116
Функция fgets считывает из потока все символы, включая символ перевода строки, т.е. '\n'. Поэтому для того, чтобы цикл завершился необходимо введенную строку сравнивать с "exit\n", а не с "exit" как у вас.
while(strcmp(str_, "exit\n"))
	{
		fgets(str_, 30, stdin);
		printf("%s\n", str_);
	}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы