C Чтение ввода в массив символов в цикле

Я читаю информацию от stdin например, название автомобиля, тип автомобиля.

Проблема, с которой я сталкиваюсь, заключается в том, что, если я ввел количество автомобилей 2 и ввожу циклический ввод, второе значение перезаписывается на первое через scanf,

Введите количество машин:2

Введите название столбца: chevy

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

Введите название столбца:chevy2

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

теперь, если я распечатаю все, что я вижу, это электрический

 #include <stdio.h>

    int main(int argc, char *argv[])
    {
        setbuf(stdout, NULL);
        int carNum;
        int i;

        char carName[50];
        char carType[200];

        printf("\nEnter number of cars:");
        scanf("%d",&carNum);
        for(i=0;i<carNum;i++)
         {
             printf("\nEnter name of car :");
     scanf("%s", &carName[i]);

     printf("\nType of car available can be electric,gas - Enter type of car %d: ");                             
     scanf("%s", &carType[i]);
         }

         for(i=0;i<carNum;i++)
         {

             printf("\nName of car %d: ",i+1);
             printf("\n%s", &carName[i]);


             printf("\nType of car %d: ",i+1);
             printf("\n%c", &carType[i]);
         }  


        return 0;
    }

2 ответа

Решение

Изменить новый ответ:

Как вы показали, вы требуете, чтобы вы читали некоторое количество названий и типов автомобилей. Вам нужен массив строк для carName а также cartype вместо простого массива символов. как (для решения эссе):

 #define LEN 100     // declare sufficient length size 

 char carName[50][LEN];   // in main()
 char carType[50][LEN];

и ваши правильные выражения scanf и printf должны быть такими:

scanf("%d",&carNum);
for(i=0;i<carNum;i++){
    printf("\nEnter name of car :");
    scanf("%s", carName[i]);
    printf("\nType of car available can be electric,gas - Enter type ofcar: ");
    scanf("%s", carType[i]);
}
for(i=0;i<carNum;i++){
    printf("\nName of car %d: ",i+1);
    printf("\n%s", carName[i]);
    printf("\nType of car %d: ",i+1);
    printf("\n%s", carType[i]);
}    

(обратите внимание: когда я пользователь %s Я даю char* как аргумент в scanf, а также в printf)
старый ответ: в первом цикле for, ваши выражения scanf неверны:

     scanf("%s", &carName[i]);
                          ^  remove [i]
     scanf("%s", &carType[i]);
                          ^  remove [i]

Вам просто нужно написать так:

    // printf
    scanf("%s", &carName);
    //print                    
    scanf("%s", &carType);

Во втором цикле в printf операторы неверны.

printf("\n%c", &carType[i]);
               ^  not need

правильно это

printf("\n%c", carType[i]);   

Также я думаю, что ваше требование:

printf("\n%s", carType);

Объявляемые массивы не представляют строки, они представляют непрерывную память, состоящую из 50 байтов и 200 байтов. Этого достаточно, чтобы сохранить одну строку из 50 символов и строку из 200 символов соответственно. Вам нужен массив строк, объявленных так.

char * carnames[MAX_INPUT];

Я полагаю, вы создаете буфер для чтения каждой строки, а затем использовать strdup() который скопирует и распределит строку по ее месту в именах машин.

Вот пример:

char buffer[80];
char * carnames[MAX_INPUT];

for(i=0;i<carNum;i++)
{
  scanf("%s", buffer);
  carnames[i] = strdup(buffer);
}

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

Другие вопросы по тегам