我正在尝试从2个数组中打印结构中的值,但输出非常奇怪,我不知道为什么。
这是什么? C123 6545645 bvabc123 vabc123 abc132
应该宣布: 约翰 47 汽车 沃尔沃 ABC123
什么不对?
struct person{
char name;
int age;
};
typedef struct person p;
struct vehicle{
char type;
char brand;
char regn;
char owner;
};
typedef struct vehicle v;
int main(){
p owner[1];
v Vehicle[1];
for(int i=0; i<1;i++){
printf("Name\n");
scanf("%s",&owner[i].name);
printf("Age\n");
scanf("%d",&owner[i].age);
printf("Type\n");
scanf("%s",&Vehicle[i].type);
printf("Brand\n");
scanf("%s",&Vehicle[i].brand);
printf("regn\n");
scanf("%s",&Vehicle[i].regn);
}
for(int j=0; j<1; j++){
printf("%s\n", &owner[j].name);
printf("%d\n", &owner[j].age);
printf("%s\n", &Vehicle[j].type);
printf("%s\n", &Vehicle[j].brand);
printf("%s\n", &Vehicle[j].regn);
}
}
答案 0 :(得分:1)
C中的char
字面意思是单个字符。 char
只是一个带符号的8位整数。因此,当您在代码中编写char
时,您告诉C您正在存储一个8位整数 - 仅此而已。另一方面,字符串由许多字符组成,其中每个字符是8位整数(即a char
)。在C中,字符串作为连续的8位整数存储在内存(数组)中,其中数组的长度比字符串的长度多一个,并且数组末尾的这个额外元素是空终止符(单个字节,只是一个0)。由于字符串可以是任意长度,我们需要知道它们有多长(即内存中的数组结束的位置)。 C通过在字符串的末尾使用此null终止符来完成此操作。
在您的代码中,当您在结构定义中编写char
时,您告诉C只存储单个字符。你想要的是char *
(指向char
的指针),它指向一个char
s数组,其中最后一个元素是空终止符。如果在分配字符串时使用双引号,C会为您插入此终止符。
你想要的是这样的:
typedef struct person {
char *name;
// ...
} p;
int main(int argc, char *argv[]) {
p person;
person.name = "The name";
printf("%s\n", person.name); // Prints `The name`
}
答案 1 :(得分:1)
问题是char
应该是单个字符,例如'a'
,'B'
,'1'
等。所以你需要的是一系列的。下面我随意选择32作为数组的长度
请注意,我从代码中的多个位置删除了&
,因为它现在使用数组而不是单个字符:
#include <stdio.h>
struct person {
char name[32];
int age;
};
typedef struct person p;
struct vehicle {
char type[32];
char brand[32];
char regn[32];
char owner[32];
};
typedef struct vehicle v;
int main(){
p owner[1];
v Vehicle[1];
for (int i = 0; i < 1; i++) {
printf("Name\n");
scanf("%s", owner[i].name);
printf("Age\n");
scanf("%d", &owner[i].age);
printf("Type\n");
scanf("%s", Vehicle[i].type);
printf("Brand\n");
scanf("%s", Vehicle[i].brand);
printf("regn\n");
scanf("%s", Vehicle[i].regn);
}
for (int j = 0; j < 1; j++) {
printf("%s\n", owner[j].name);
printf("%d\n", owner[j].age);
printf("%s\n", Vehicle[j].type);
printf("%s\n", Vehicle[j].brand);
printf("%s\n", Vehicle[j].regn);
}
}
另请注意,如果用户输入溢出存储空间32的字符串,则此代码将导致未定义的行为,因为它不会检查该字符串。此外,如果用户为任何会导致问题的scanf
输入空格。如果这对您很重要,可以找到解决方案:How do you allow spaces to be entered using scanf?
答案 2 :(得分:1)
首先,对于name,type,brand和regn变量,它们是字符串,因此您应该使用char数组来定义它们。
其次,你不应该使用&amp;在scanf函数中,当变量是数组时; 最后,你不应该使用&amp;在printf函数中。
最后,你不应该使用&amp;在printf函数中。
scanf("%s",owner[i].name);
printf("%s\n",owner[j].name);