C在循环中将输入读入char数组

时间:2013-03-30 18:16:51

标签: c stdin

我正在阅读来自stdin的输入,例如汽车名称,汽车类型。

我面临的问题是,如果我输入了多少辆车,我就拿走了 输入循环,第二个值通过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 个答案:

答案 0 :(得分:2)

修改新答案:

正如您所示,您要求阅读一些汽车名称和类型您需要carNamecartype的字符串数组,而不是简单的char数组。喜欢(对于一篇论文解决方案):

 #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时,我在scanf和printf中提供char*作为参数旧答案: 在第一个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);

答案 1 :(得分:2)

您声明的数组不代表字符串,它表示由50个字节和200个字节组成的连续内存。这足以存储单个50个字符的字符串,并且分别存储200个字符串。 你需要的是一个字符串数组,声明如下。

char * carnames[MAX_INPUT];

我认为你创建了一个用于读取每个字符串的缓冲区,然后使用strdup()来复制并将字符串分配给它在carnames中的位置。

以下是一个例子:

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

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

请注意strdup为字符串分配内存,所以一旦完成,你应该释放内存。