Массивы не хранят значения в цикле - PullRequest
0 голосов
/ 08 января 2020

Это мой C код. Я пытаюсь сохранить значения в своих массивах, используя for-l oop, но ничего не сохраняется, и изменяется только значение переменной trackingCodes. Я не знаю, откуда происходят ошибки. Нет ошибок компиляции

#include <stdio.h>

int main(void) {
int trackingCodes = 0;
char typeCode[trackingCodes];
int codeLength [trackingCodes];
int byteChar = 0;
int byteInt = 0;
int byteDouble = 0;
int j = 0;
int totalBytes = 0;
int totalByteDouble = 0;
int totalByteInt = 0;
int totalByteChar = 0;


scanf("%d", &trackingCodes);

for ( j = 0; j < trackingCodes; j++)
{
    scanf("%d %c", &codeLength[j], &typeCode[j]);
    if (typeCode[j] == 'c')
    {
        byteChar = codeLength[j] * sizeof(char);
        totalByteChar = totalByteChar + byteChar;

    }
     else if (typeCode[j] == 'i')
    {
        byteInt = codeLength[j] * sizeof(int);
        totalByteInt = totalByteInt + byteInt;

    }
     else if (typeCode[j] == 'd')
    {
        byteDouble = codeLength[j] * sizeof(double);
        totalByteDouble = totalByteDouble + byteDouble;

    } 

}

    totalBytes = totalByteChar + totalByteDouble + totalByteInt;
    int t = 0;

    for(t = 0; t < trackingCodes; t++){
        if(codeLength[t] != 'i' && codeLength[t] != 'c' && codeLength[t] != 'd'){
            printf("Invalid Tracking code type");
            return 0;
        }
    }

    printf("%d bytes\n", totalBytes);



    return 0;
}```

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Вам нужно переместить определение массива так, чтобы оно было после того, как вы прочитали trackingCodes. Таким образом, вы создаете массив переменной длины с отсканированным размером. Как:

scanf("%d", &trackingCodes);

char typeCode[trackingCodes];
int codeLength [trackingCodes];

И ... Всегда проверяйте возвращаемое значение от scanf - то есть:

if (scanf("%d", &trackingCodes) != 1)
{
    // error handling
}
0 голосов
/ 09 января 2020

Я думаю, вы думаете, что код:

int trackingCodes = 0;
char typeCode[trackingCode];

будет бесконечно привязывать размер typeCode к значению trackingCodes. Фактически будет объявлено typeCode с размером текущего значения , равным trackingCodes.

Решения состоят в том, чтобы либо сканировать ваш ввод с stdin, как описано в ответе @ 4386427, или выделить его с помощью динамического c управления памятью (malloc / free и др.)

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