2016-09-01 3 views
1

Я пытаюсь сделать программу, которая читает положительные цифры с разделителями-разделителями в C и дает сообщение об ошибке ЛЮБОЙ другой формат ввода.Как читать разделенные пробелом цифры 0-9 в C?

Например, следующие входы являются правильными:

0 1 2 3 4 5 6 7 8 9 
9 8 7 6 5 4 3 2 1 0 
7 6 5 4 3 
1 2 3 
... 

Для всех остальных входов, программа должна прекратить и сообщение об ошибке должно быть напечатано. Например:

0 1,2 3 4-5 67 89 

0a2b3c4d5e6f7g8h9i 
... 

Вот моя попытка:

... 
int inputArr[999]; 
int length = 0; 
char c = getchar(); 

while (c != '\n') { 
    if (isdigit(c)) { 
     inputArr[length] = c - '0'; 
     length++; 
    } else { 
     printf ("Wrong Input Format!\n"); 
    } 
    c = getchar(); 
    if (c != ' ') { 
     printf ("Wrong Input Format!\n"); 
    } else { 
     continue; 
    } 
} 
... 

, но это дает сообщение об ошибке, даже если вход является правильным.

Update:

Когда я введите следующее:

0 1 2 3 4 5 6 7 8 9 

Я ожидаю, что программа не дает мне никаких сообщений об ошибках, но я получаю ровно 10 сообщений об ошибках (После удаления строки exit(1);) , Я предполагаю, что это одно сообщение об ошибке для каждого символа после 1 и (это 9 сообщений) и 1 сообщение для символа '\ n' в конце.

+0

Спасибо, но не совсем: Цель названия в основном заключается в листинге на индексе, чтобы привлечь внимание людей. Но тело поста должно быть также вопросом. Он должен точно указать, что вы ожидали, что пошло не так, и ваш конкретный вопрос был как можно сужен. Не просто спросите «почему это не работает», а спросите конкретно «почему X не делает Y по Z, когда руководство утверждает, что X должен делать Y (цитата)» и т. Д. –

+0

Ваша логика кажется довольно сломанной , У вас есть все эти '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', ' Таким образом, вы в принципе не имеете возможности обнаружить ошибку в нужное время. И ваше обнаружение новой строки также является неполным. И у вас нет механизма для обнаружения конца ввода. –

+0

Я добавил else заявления, но я до сих пор не понимаю, почему я получаю сообщение об ошибке, когда ввод находится в правильном формате. – user6005857

ответ

2

Попробуйте это: позволяет

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

void e() { puts("Bad input."); exit(EXIT_FAILURE); } 

int main(void) 
{ 
    for (int c1 = 0, c2 = 0; c1 != EOF && c2 != EOF;) 
    { 
     c1 = getchar(); 
     if (c1 == EOF || c1 == '\n') continue; // file or line ends in "x " 
     if (!isdigit(c1)) e(); 

     c2 = getchar(); 
     if (c2 != EOF && c2 != '\n' && c2 != ' ') e(); 

     printf("Got input: '%c'.\n", c1); 
    } 
} 

Эта версия завершающие пробелы в конце строки. Если вы не хотите, чтобы конечные пробелы (т.е. "1 2" в порядке, но "1 2 " ошибка), изменить первое условие для:

if (c1 == EOF || c1 == '\n' || !isdigit(c1)) e(); 
+0

[Демонстрация] (https://ideone.com/AcCyRx) –

+0

Большое спасибо. Я буду играть с ним. Я думаю о том, чтобы создать допустимый формат ввода нескольких пространств. – user6005857

+0

@ user6005857: Вероятно, вам нужно «scanf», а не делать все это вручную. –

1

Флаг может быть использован для сигнала, когда цифра читается и предотвращать последовательные цифры. Последовательные пробелы не будут отклонены.

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

int main(void) 
{ 
    int inputArr[999]; 
    int c = 0; 
    int length = 0; 
    int gotdigit = 0; 

    while ((c = getchar ()) != '\n' && c != EOF) { 
     if (isdigit (c) && !gotdigit) {//found digit and no prior consecutive digit 
      inputArr[length] = c - '0'; 
      length++; 
      if (length >= 999) { 
       break; 
      } 
      gotdigit = 1;//set true to prevent consecutive digits 
     } else { 
      if (c == ' ') { 
       gotdigit = 0;//set false. found space so next digit is ok 
      } 
      else {//not a space or was consecutive digit 
       printf ("Wrong Input Format!\n"); 
      } 
     } 
    } 

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