2017-02-12 3 views
0

Редактирование Я меняю my для циклов на функцию с именем input и инициализировал значение c в указанной функции. Также изменилось условие ветвления внутри цикла, чтобы при необходимости вставить '\0' в пятый элемент. Моя первоначальная проблема string1, разлитая в string2, по-прежнему сохраняется. Я избавился от fflush(stdin), потому что не уверен, поддерживается ли он Mac OSX El Capitan.с использованием getchar() в C для отправки ввода в массив символов

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

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

void input(char *s1, int size){ 
    for(int i = 0, c = 0; (i < size) && (c != '\n'); i++){ 
     c = getchar(); 

     if(i == size - 1 || c == '\n') 
      s1[i] = '\0'; 
     else 
      s1[i] = c; 
    } 
} 

int main(){ 
    const int SIZE = 5; 
    char string1[ SIZE ]; // create a char array 
    char string2[ SIZE ]; // and another one 

    printf("Enter two strings: "); 

    input(string1, SIZE); 
    printf("String1: %s\n", string1); 
    input(string2, SIZE); 
    printf("String2: %s\n", string2); 
} 

Пример вывода ...

Enter two strings: foobarr 
String1: foob 
String2: rr 

Как я могу изменить это так, что 'arr' полностью игнорируется, и

getchar() 

во втором ждет вызова функции для ввода новых?

+3

Есть две (несвязанные) проблемы: если между пятью символами, которые вы читаете, нет новой строки, у вас будет неисчерпаемая строка. Кроме того, и многое другое связано с вашей проблемой, вызов 'fflush' с потоком только для ввода, например' stdin', является технически неопределенным поведением *. Вы также можете рассмотреть * инициализацию * 'c', прежде чем использовать его в состоянии цикла. –

+0

Что касается того, о чем вы спрашиваете, как насчет того, чтобы просто читать, пока вы не получите * новую строку? –

+1

Обратите внимание, что поддерживаются только некоторые платформы [Использование 'fflush (stdin)'] (http://stackoverflow.com/questions/2979209/using-fflushstdin). –

ответ

0

Хорошо, это работает, я получил clear_buffer() функция от How to clear input buffer in C?.

void input(char *s1, int size){ 

    for(int i = 0, c = 0; (i < size) && (c != '\n'); i++){ 
     c = getchar(); 

     // if we're out of space or the user is done with this string 
     if(i == size - 1 || c == '\n'){ 

      // add null char to the array 
      s1[i] = '\0'; 

      // if we added null char because we ran out of space 
      if(i == size - 1) 
       clear_buffer(); 
     } 
     //Otherwise add a char to the array 
     else 
      s1[i] = c; 
    } 
} 

void clear_buffer(){ 
    char c = '\0'; 
    while ((c = getchar()) != '\n' && c != EOF) { } 
} 



int main(){ 
    const int SIZE = 5; 

    printf("Enter two strings: "); 

    char string1[ SIZE ] = { '\0' }; // create a char array 
    input(string1, SIZE); 
    printf("String1: %s\n", string1); 

    char string2[ SIZE ] = { '\0' }; // create another char array 
    input(string2, SIZE); 
    printf("String2: %s\n", string2); 

    return 0; 
} 
Смежные вопросы