2013-03-30 75 views
0

我正在读取来自stdin的输入,例如,汽车的名称,汽车的类型。C将输入读入循环中的字符数组中

我面临的问题是,如果我输入车辆数量2,并且我输入 循环,则第二个值将通过scanf覆盖为第一个值。

输入汽车的数量:2

输入列的名称:雪佛兰

可用的汽车类型可以是电,气 - 输入汽车的类型:气体

输入列的名称: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

编辑新的答案:

正如你表明你想读一些数车名和类型的你需要的字符串数组carNamecartype,而不是简单的字符数组你的要求。像(对于文章的解决方案):

#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); 
+0

不会更新的问题。 –

+0

无法正常工作,您正尝试像这样写入char **。 – stdcall

+0

好的,对不起,我改成原来的。 – jamesT

2

你声明并不表示字符串这些阵列,它代表的50组成的连续内存字节和200字节。这足以存储单个50个字符的字符串和200个字符串。 你需要的是一个字符串数组,声明像这样。

char * carnames[MAX_INPUT]; 

我sugesst创建缓冲区读取每个字符串,然后用strdup()会拷贝并分配字符串这是发生在carnames。

下面是一个例子:

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

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

注意的strdup的字符串分配内存,所以一旦你做到了,应该释放内存。

+0

感谢您的回答。这是另一种可能性。 – jamesT

+0

感谢您的帮助和解答。我无法让它工作。 Char中的C应该小写。我会再试一次。 – jamesT

+0

我修好了,这是Ipad的自动大写 – stdcall