2016-01-05 2 views
0

Я делаю программу, и в этой программе у меня есть два процесса: сервер и клиент. Сервер должен читать строку из ввода, а затем записывать в файл FIFO. Клиент должен читать строки из файла FIFO и затем записывать в .txt-файл. Это только функция, отвечающая за сервер и клиент. Файл FIFO и fork'ing выполняет основную функцию.Как писать и читать более одного слова в строке C

void server(void) 
{ 
    FILE *fp1, *fp2; 
    char string[100]; 

    while(1) 
    { 
     fp1 = fopen("FIFO1", "w"); 
     fprintf(stdout, "Type string: "); 
     scanf("%s", string); 
     fputs(string, fp1); 
     fclose(fp1); 

     sleep(1); 
    } 
} 
void client(void) 
{ 
    FILE *fp,*fp1; 
    char string[100]; 
    while(1) 
    { 
     fp = fopen("FIFO1", "r"); 
     fgets(string, 100, fp); 
     fclose(fp); 
     fp1 = fopen("file.txt", "a"); 
     fprintf(fp1,"%d_file: I get: %s\n", getpid(), string); 
     fclose(fp1);  
    } 
} 

И моя проблема, когда я ввести строку типа «переполнение стека», когда у меня есть два слова, в моем file.txt я добраться до линии:

8965_file: I get: stack 
8965_file: I get: overflow 

Есть ли способ, чтобы написать это в одной строке? Как это:

8965_file: I get: stack overflow 

ответ

2

Это из-за scanf(), который останавливает чтение, когда белое пространство происходит за "%s" спецификатора, изменить его "%99[^\n]" или использовать fgets(), но вместо этого иметь в виду, что fgets() будет читать '\n' и fputs() добавит один так что у вас может быть больше строк, чем вы хотите.

Подсказка: Для массива используйте fgets(string, sizeof(string), fp);, чтобы сделать код более удобным для обслуживания.

+0

'Оферты()' добавляет символ новой строки, 'fputs()' не делает. –

+0

Я изменяю «% s» на «% 99 [^ \ n]», и у меня появилось странное поведение, потому что программа записывает на экран несколько раз, что я не могу сосчитать, «Введите строку:» и в файле она пишется несколько раз », 8965_file: Я получаю: переполнение стека », а затем заканчивается :(любые идеи, почему? –

-2

Вы можете использовать gets(string), чтобы получить более одного слова, а не использовать scanf().

Ссылка Ссылка: www.keizerkong.com/c/c_string.html

+1

получает опасно, потому что вы не указываете длину своего буфера, поэтому он может быть переполнен слишком большим количеством входных данных - вместо этого используйте' fgets() ' –

+0

Это работает :) У меня есть предупреждение, что функция становится опасной и ее не следует использовать. Вот почему: http://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used –

+0

@John Hascall спасибо :) Я изменил scanf на сервере на fgets (string, sizeof (string), stdin); –

Смежные вопросы