Что не так с этой программой на C? - PullRequest
0 голосов
/ 15 мая 2010

Это должно дать мне количество входов, введенных пользователем. Но это дает 100. Я скомпилирован с GCC.

#include <stdio.h>

int arr[100];
int count=0;
int max=100;


int main(){
 int i, input;
 printf("Enter integer values one by one, q to quit.\n");
 for(i=0;i<max;i++){
  scanf("%d",&input);
  arr[i]=input;
  if(input=='q')break;
  count++;
 }
 printf("You entered %d values.\n",count);
 return 0;
}

Ответы [ 7 ]

5 голосов
/ 15 мая 2010

Если вы читаете в числовую переменную, она не может иметь значение 'q', поэтому ваш тест не будет работать. Если вы хотите написать подобный код, вы должны прочитать пользовательский ввод в строку, проверить, содержит ли строка «q» и, если нет, преобразовать ее в целое число.

3 голосов
/ 15 мая 2010

scanf имеет возвращаемое значение.Используйте его, чтобы проверить, действительно ли scanf мог анализировать что-либо.В вашем сценарии 'q' никогда не будет храниться в переменной input, представляющей собой символ или числовое представление.Вы не можете прочитать «q» как «% d», и, следовательно, scanf завершится с ошибкой.

Проверка возвращаемого значения scanf для определения break.

1 голос
/ 15 мая 2010

scanf% d не понимает 'q'. Вы можете проверить возвращаемое значение scanf, хотя - если он возвращает 0, пользователь не ввел правильное число.

Если только q, а не другие нечисловые строки должны завершать цикл, считайте строку и проверьте, является ли она q и, если нет, преобразуйте ее в int с помощью atoi ().

0 голосов
/ 15 мая 2010

scanf вернет 0 в вашем коде, если введенный символ не соответствует спецификации преобразования. Но следующий вызов для scanf возобновит поиск сразу после последнего преобразованного символа. Поэтому вы можете попробовать следующий код:

#include <stdio.h>

int arr[100];
int count=0;
int max=100;


int main(){
   int i, input, ret;
   char end; 
   printf("Enter integer values one by one, q to quit.\n");
   for(i=0;i<max;i++)
   {
      ret = scanf("%d",&input);
      if (!ret)
      {
         scanf("%c", &end);
         if ( end == 'q')
            break;
         else
           continue;
      }
      arr[i]=input;
      count++;
   }
   printf("You entered %d values.\n",count);
   return 0;
}

Делая это, вы можете убедиться, что элемент управления не выйдет из цикла, если вы не введете q и в массив скопированы только допустимые значения.

0 голосов
/ 15 мая 2010

:) Позвольте мне изменить эту программу следующим образом:

#include <stdio.h> 

int arr[100]; 
int count=0; 
int max=100; 


int main(){ 
 int i, input; 
 printf("Enter integer values one by one, -1 to quit.\n"); 
 for(i=0;i<max;i++){ 
  scanf("%d",&input); 
  arr[i]=input; 
  if(input==-1)break; 
  count++; 
 } 
 printf("You entered %d values.\n",count); 
 return 0; 
}

Вы не можете использовать числовую переменную для получения значения char. Если вы измените это так, это сработает. :)

0 голосов
/ 15 мая 2010

Cute. Ввод 'q' приводит к сбою сканирования, при этом input остается равным последнему значению Эта разорванная петля продолжается до конца диапазона. Конечно, тест input=='q' никогда не удался.

0 голосов
/ 15 мая 2010

вы выходите из программы, набирая значение ascii для 'q', а не q /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...