2012-09-15 2 views
0

Я просто немного смущен тем, как я мог реализовать эту часть своего кода.Читайте в строке пользователю до "." используется

Мне нужно прочитать от пользователя строку, которая может содержать до 256 символов. Строка также должна включать любые интервалы и новую строку, если пользователь вводит ее. Когда пользователь сам вводит ".", он сообщает программе, что ввод выполнен. По завершении ввода программа выплескивает ту же строку с тем же интервалом и новой строкой.

Например:

Please enter a string: This is just a test. 
The input has not ended yet. 
It will end when the user enters just a period. 
. 

возвратов программы:

This is just a test. 
The input has not ended yet. 
It will end when the user enters just a period. 

До сих пор единственным способом я могу думать, делать это с помощью fgets(), но я не совсем уверен, как сделать проверку, когда ввод выполняется с помощью ".". Я думал, возможно, цикл, который постоянно проверяется?

Любая помощь будет оценена по достоинству. Спасибо!

+0

Это домашнее задание? что ты уже испробовал? – Levon

+0

@levon Обратите внимание, что домашняя метка теперь обескуражена: http://meta.stackexchange.com/questions/147100/trogdor-ate-my-homework-tag – Macmade

+0

@Macmade Я знаком с этим .. однако, это делает не означает, что OP не должен упоминать об этом (и не может использовать тег), поскольку вопрос о домашних заданиях [задан и дан ответ] (http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer- домашние задания-вопросы) отличается от других вопросов. – Levon

ответ

1

Идея заключается в том, чтобы использовать буфер, который вы будете перераспределять каждый раз есть новые данные, поступающие в и следить за его размера:

char* data = NULL; 
size_t size = 0; 

Ваше предположение верно, то вам нужна петля для этого. Что-то вроде этого:

int end = 0; 
while (!end) { 
    char buf[512]; 
    if (fgets(buf, sizeof buf, stdin) == NULL) { 
     // an error occured, you probably should abort the program 
    } 
} 

Вы должны проверить, если буфер фактически маркер вы хотите, чтобы закончить ввод данных:

if (strcmp(buf, ".\n") == 0) { 
    // end loop 
} 

Если маркер не найден, то вам нужно перераспределять буфер данных, удлиняя его по длине строки, которую вы только что прочитали:

size_t len = strlen(buf); 
char* tmp = realloc(data, size + len + 1); // ... plus the null terminator 
if (tmp == NULL) { 
    // handle your allocation failure 
} 

... и скопировать новый контент в конце:

data = tmp; 
memcpy(data + size, buf, len); 
size += len; 
data[size] = '\0';       // don't forget the null terminator 

Когда вы закончите, выводить его и очистить:

printf("%s", data); 
free(data); 

Заполните пробелы, собирать, и вы будете иметь рабочую, безопасную программу, которая делает то, что вы просили.

+0

Большое спасибо! Я отредактировал его, чтобы он отлично работал с тем, что мне нужно! Еще раз спасибо !!!!! – user1009706

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