2016-04-04 2 views
2

Мне нужно ввести пользователей (звездочку или пробел), и если пользователь ввел звездочку I затем вставлял бы 1 в массив, если бы пользователь ввел пробел, я бы тогда ввел 0 в массив. Вот то, что я до сих пор:Добавьте 1, если пользователь ввел «*» или добавил 0, если пользователь ввел «» в массив в C

#include <stdio.h> 
#include <stdlib.h> 

void userInput(){ 
    printf("Enter Generation 0 (Length must be 10, * for 1 and " " for 0):\n"); 
    char c;     /* int */ 
    int count; 
    char arr[10]; 
    for(int i = 0; i < 10; i++){ 
     scanf("%c", &c); 
     if(c == '*') 
      arr[i] = '1'; 
     else 
      arr[i] = '0'; 
    } 
    for(int j = 0; j < 10; j++){ 
     printf("%c", arr[j]); 
    } 
} 

int main(int argc, const char * argv[]) { 
    userInput(); 
} 

Проблема заключается в том, что цикл только позволяет пользователю ввести символ в 6 раз, а затем печатает.

выход, если я введу все * s:

Enter Generation 0 (Length must be 10, * for 1 and for 0): 
* 
* 
* 
* 
* 
1010101010 

выход, если я все пробелы:

Enter Generation 0 (Length must be 80, * for 1 and for 0): 





0000000000 
+6

'scanf ("% c ", &c);' -> 'scanf ("% c ", &c);' обратите внимание на добавленное пространство, чтобы предотвратить чтение предыдущей 'новой строки'. –

+1

В качестве альтернативы предложению Weather Vane , убедитесь, что введенный символ является либо звездочкой, либо пробелом перед добавлением в массив. (Это может включать в себя поворот цикла for к while, где вы выдвигаете 'i' только при добавлении к строке.) –

+0

Если вы 're on ascii, вы можете записать '' 0 '+ ((c >> 1) и 1)' в массив безоговорочно. – EOF

ответ

4

Есть множество способов приблизиться захвата '*' и ' ' и перевод их в 1 и 0, соответственно. Вы в основном пишете небольшой обработчик ввода, который будет читаться до тех пор, пока ваш массив не будет заполнен, или пользователь не завершит ввод с [ctrl + d]. Вам просто нужно проверить, чтобы массив не был заполнен и что вы не достигли EOF. Что-то простое будет делать:

#include <stdio.h> 

#define MAXC 10 

int main (void) { 

    unsigned char arr[MAXC] = {0}; 
    int c = 0, i, idx = 0; 

    while (idx < MAXC && (c = getchar()) != EOF) { 
     if (c == '*') arr[idx++] = 1u; 
     if (c == ' ') arr[idx++] = 0u; 
    } 

    for (i = 0; i < idx; i++) 
     printf (" arr[%d] : %u\n", i, arr[i]); 

    return 0; 
} 

Он будет принимать любую форму ввода, действовать соответствующим образом для '*' и ' ', и игнорировать дополнительные символы, пока массив не будет заполнен или EOF генерируется:

Пример использования/Выход

$ ./bin/rdspcasterix 
(**) (**) 
    (**) 
* 
arr[0] : 1 
arr[1] : 1 
arr[2] : 0 
arr[3] : 1 
arr[4] : 1 
arr[5] : 0 
arr[6] : 0 
arr[7] : 1 
arr[8] : 1 
arr[9] : 1 

$ ./bin/rdspcasterix 
The quick*brown fox*jumps over*a lazy*dog 
** ** 
arr[0] : 0 
arr[1] : 1 
arr[2] : 0 
arr[3] : 1 
arr[4] : 0 
arr[5] : 1 
arr[6] : 0 
arr[7] : 1 
arr[8] : 1 
arr[9] : 1 

Там не один-правильный способ сделать это, чтобы взглянуть на все ответы и выбрать тот, который лучше работает для ваша ситуация.

+0

Вы должны проверить 'EOF' во внутреннем цикле. Новая строка уже игнорируется фильтрами, как любой другой символ. – Olaf

+0

Согласен. Спасибо –

+0

Ehm, Вы можете удалить проверку эксплойта для новой строки. Почему это должно рассматриваться иначе, чем, например, ' 'A''? Просто 'while ((idx ...) && ((c = getchar())! = EOF)) {...' – Olaf

1

Вы также можете использовать fgetc с STDIN в качестве файлового потока для чтения полукокса по полукокса

РЕДАКТИРОВАТЬ Добавлено решение с проверкой буфера

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#define EXTRACHARS 2 
#define SIZE 10 

static void clear_buf(void) 
{ 
    int ch; 
    while(ch = getc(stdin), ch != '\n' && ch!=EOF); 
    clearerr(stdin); 
} 
int main(void) 
{ 
    int c = 0; 
    char seq[SIZE + EXTRACHARS]; 

    printf("Enter 10 * or ' ': "); 
    fgets(seq, SIZE+EXTRACHARS, stdin); 
    if (seq[strlen(seq)- 1] != '\n') 
    { 
     printf("Buffer overflowed \n"); 
     clear_buf(); 
    } 
    else 
    { 
     while(c < SIZE) 
    { 
     if(seq[c] == '*') 
     { 
      printf("1"); 
     } 
     else if(seq[c] == ' ') 
     { 
      printf("0"); 
     } 
     ++c; 
    } 
     printf("\n"); 
    } 
    return EXIT_SUCCESS; 
} 
+1

Это не решит проблему. – Olaf

+0

Добавлено решение, использующее безопасность буфера – PSD

0

нормально новый код работать действительно хорошо для меня протестирована на QT Ide Mingw Compiler

#include <stdio.h> 
#include <stdlib.h> 

void userInput(){ 
    printf("Enter Generation 0 (Length must be 10, * for 1 and " " for 0):\n"); 
    char c; 
    char temp; 
    char arr[10]; 
    int i=0; 
    do{ 
     printf("\nEnter number %d : ", i+1); 
     c = getchar(); 
     while((temp = getchar()) != '\n' && c != EOF); // this is alternative to fflush 
     if(c == 42)  // 42 is ascii code to * 
      arr[i] = '1'; 
     else 
      arr[i] = '0'; 

     i++; 
    }while((c!=EOF)&&(i<10)); 
    for(int j = 0; j < 10; j++){ 
     printf("%c\n", arr[j]); 
    } 
} 

int main(int argc, const char * argv[]) { 
    userInput(); 
} 

это не может работать на интернет-трансляторов

+0

Я думаю 'if (c == '*') 'будет лучше –

+0

ОК, я буду красив, как пользовательское удобство использования 42 или '*' ty для комментария :) –

+0

Эта программа имеет такую ​​же проблему, как OP. –

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