shreyas s Ответов: 3

[Новичок] ошибка с выводом в программе C


Программа для чтения и записи массива:

ошибка с выводом данных
Количество отсканированных цифр != количество напечатанных цифр

Что я уже пробовал:

#include <stdio.h>

int main()
{
    int x;
    int arr[x];
    int i;
    printf("Enter the value of 'x'\n");
    scanf(" %d", &x);
    printf("Enter %d elements\n",x+1);
    for(i=0;i<x;i++)
    {
        scanf(" %d\n", &arr[i]);
    }
    printf("the digits you entered are as follows: \n");
    for(i=0;i<x;i++)
    {
        printf("%d\t",arr[i]);
    }

    return 0;
}

3 Ответов

Рейтинг:
18

CPallini

Как уже отмечали другие, вам нужно создать массив после ты же знаешь его размеры. С собой C99 совместимый компилятор (например GCC) вы можете написать::
Пожалуйста, обратите внимание: чтобы упростить код, я опустил проверку scanf значение. Вы всегда должны выполнять такую проверку в реальном коде.

#include <stdio.h>

int main()
{
    int x;
    int i;

    printf("Enter the value of 'x'\n");
    scanf("%d", &x);

    int arr[x]; // here you know the array size.

    printf("Enter %d elements\n",x);
    for(i=0;i<x;i++)
    {
        scanf("%d", &arr[i]);
    }
    printf("the digits you entered are as follows: \n");
    for(i=0;i<x;i++)
    {
        printf("%d\t",arr[i]);
    }
    printf("\n");
    return 0;
}

С другой стороны, с помощью не-C99-совместимый компилятор вы должны написать что-то вроде:
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int x;
    int i;

    printf("Enter the value of 'x'\n");
    scanf("%d", &x);

    int * arr = (int *) malloc( sizeof(int) * x); // dynamically allocate memory on the heap
    if ( ! arr ) return -1;

    printf("Enter %d elements\n",x);
    for(i=0;i<x;i++)
    {
        scanf("%d", &arr[i]);
    }
    printf("the digits you entered are as follows: \n");
    for(i=0;i<x;i++)
    {
        printf("%d\t",arr[i]);
    }
    printf("\n");

    free (arr); // release the heap allocated memory

    return 0;
}


shreyas s

Как новичок в мире программирования, должен ли я изучать версию C99 или C11?
Большинство онлайн-учебников-это C99ish, не так ли?

CPallini

Если бы компилятор поддерживал меня, я бы использовал последнюю версию statndard (если только вам не придется сталкиваться с проблемами совместимости с устаревшими приложениями).
Обратите внимание, что под компилятором 'not-C99-compliant' я подразумевал устаревшие компиляторы (C89 orC90).

Рейтинг:
0

Patrice T

Вы не можете создать массив с динамическим размером, не зная этого размера.

int x;
int arr[x]; // you create the array here
int i;
printf("Enter the value of 'x'\n");
scanf(" %d", &x); // you know the array size here


Совет: используйте отладчик, чтобы проверить, что все идет так, как ожидалось.
Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


shreyas s

Спасибо

Patrice T

Вы приветствуете.

Рейтинг:
0

Richard MacCutchan

Вам действительно нужно раздобыть хорошую книгу по программированию на языке Си, что-то вроде Язык программирования Си, Брайан У. Керниган и Деннис М. Ричи[^]. Вы будете учиться гораздо быстрее из книги или онлайн-учебников. Эти форумы не предназначены для обучения вас программированию.


shreyas s

Да, я пытался читать эту книгу, но понимание концепций было для меня нелегким:( поэтому я решил учиться на онлайн-ресурсах.
Я прошу прощения за то, что беспокою людей здесь своими глупыми вопросами, а также знаете ли вы какое-нибудь место(сайт) в интернете, где такие нубы, как я, могут задавать подобные вопросы?

Richard MacCutchan

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

shreyas s

О, я понимаю, что ты имеешь в виду.
Спасибо за совет:)