我正在阅读来自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;
}
答案 0 :(得分:2)
修改新答案:
正如您所示,您要求阅读一些汽车名称和类型您需要carName
和cartype
的字符串数组,而不是简单的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为字符串分配内存,所以一旦完成,你应该释放内存。