Необычное поведение при передаче массива в функцию - PullRequest
0 голосов
/ 15 октября 2010
#include <stdio.h>
#define SIZE 5

void func(int*);
int main(void)
{
  int i, arr[SIZE];
  for(i=0; i<SIZE; i++)
    {
          printf("Enter the element arr[%d]: ", i);
          scanf("%d", &arr[i]);
        }//End of for loop

  func(arr);
  printf("The modified array is : ");

  for(i=0; i<SIZE; i++)
    printf("%d ", arr[i]);

  return 0;

}

  void func(int a[])
 {
   int i;

   for(i=0; i<SIZE; i++)
    a[i] = a[i]*a[i];
 }

Вывод :::

alt text

Пока я вводю целочисленные элементы, вывод в порядке. Но когда я ввел значение с плавающей точкой, например, 1,5, он не сделалЗапрашиваемые другие элементы и O / P, как показано на рисунке. Я думаю, что это должно неявно типизировать 1,5 к 1, но этого не произошло .. Можете ли вы сказать, почему это произошло?Вся информация о компиляторе показана на рисунке.

Ответы [ 3 ]

5 голосов
/ 15 октября 2010

Когда вы scanf("%d") получаете значение, подобное 1.5, сканирование останавливается в десятичной точке и возвращает 1.

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

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

В качестве отступа, scanf означает «отформатированный отсканированный», и я гарантируюничего не найдет больше в неотформатированном виде, чем пользовательский ввод.

Исследуйте поиск fgets для ввода строки.Вот копия функции, которую я часто использую для таких целей:

#include <stdio.h>
#include <string.h>

#define OK       0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
    int ch, extra;

    // Get line with buffer overrun protection.
    if (prmpt != NULL) {
        printf ("%s", prmpt);
        fflush (stdout);
    }
    if (fgets (buff, sz, stdin) == NULL)
        return NO_INPUT;

    // If it was too long, there'll be no newline. In that case, we flush
    // to end of line so that excess doesn't affect the next call.
    if (buff[strlen(buff)-1] != '\n') {
        extra = 0;
        while (((ch = getchar()) != '\n') && (ch != EOF))
            extra = 1;
        return (extra == 1) ? TOO_LONG : OK;
    }

    // Otherwise remove newline and give string back to caller.
    buff[strlen(buff)-1] = '\0';
    return OK;
}

// Test program for getLine().

int main (void) {
    int rc;
    char buff[10];

    rc = getLine ("Enter string> ", buff, sizeof(buff));
    if (rc == NO_INPUT) {
        // Extra NL since my system doesn't output that on EOF.
        printf ("\nNo input\n");
        return 1;
    }

    if (rc == TOO_LONG) {
        printf ("Input too long [%s]\n", buff);
        return 1;
    }

    printf ("OK [%s]\n", buff);

    return 0;
}

Как только вы получите строку с этой функцией, вы можете sscanf ее в своем сердцесодержание, обработка ошибок намного проще.

3 голосов
/ 15 октября 2010

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

Как это исправить? Первый шаг - забыть, что вы когда-либо слышали о scanf и всегда использовать fgets для чтения целых строк ввода, а затем обрабатывать их после того, как прочитали их в строковый буфер. Вы можете использовать sscanf для этой цели, но надежная функция, такая как strtol, будет намного лучше.

0 голосов
/ 15 октября 2010

Проблема с буфером - я думаю, что оставшаяся часть (.5) остается в буфере. используйте flushall(); после вашего scanf("%d..

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