;在编译器预期void之前。 我真正的问题是: 我能够输入ID和名称,但我无法在printf中看到它。 是因为我的数据没有记录在指针中吗? 如何解决问题?
#include <stdio.h>
struct data
{
int* ID;
char* Name;
};
int main(void)
{
struct data data1;
struct data *data1Ptr;
data1Ptr = &data1;
printf("New ID:\n");
scanf("%d",data1.ID);
printf("Name:\n");
scanf("%s",data1.Name);
printf("The new ID is \n",&data1.ID);
printf("The name input is \n",&data1.Name);
return 0;
}
答案 0 :(得分:2)
您没有正确使用printf()
。
它没有神奇地处理任何参数的格式化:你必须告诉它你要发送什么参数,以及你希望它们的值去哪里,使用格式说明符(从{{1}开始) })。
你需要:
%
另请注意,printf("The new ID is %d\n", data1.ID);
printf("The name input is '%s'\n", data1.Name);
不应为ID
,它需要存储实际的整数,因此它应仅为int *
。
答案 1 :(得分:2)
#include <stdio.h>
#include <stdlib.h> /* for malloc and free */
struct data
{
/*int* ID; why a pointer? */
int ID;
char *Name;
};
/* void main() Noooo */
int main(void)
{
struct data data1;
struct data *data1Ptr; /* unused */
data1Ptr = &data1;
printf("New ID:\n");
scanf("%d", &data1.ID); /* scanf expects a pointer */
printf("Name:\n");
/* you have to reserve mem for name before */
data1.Name = malloc(100);
/* check result of malloc here */
scanf("%s",data1.Name);
/*printf("The new ID is \n",data1.ID); You forget %d */
printf("The new ID is %d\n",data1.ID);
/* printf("The name input is \n",data1.Name); You forget %s */
printf("The name input is %s\n",data1.Name);
free(data1.Name);
return 0;
}
注意:如果您在char Name[100]
内声明名称为struct data
,则无需malloc
答案 2 :(得分:1)
这里似乎有很多问题。首先,您选择在结构中生成Name
和ID
指针。这意味着在开始使用它们之前需要动态分配内存:
struct data data1;
data1.ID = malloc(sizeof(int));
data1.Name = malloc(50); // so arbitrary amount big enough for a name.
我不确定你为什么选择将ID
作为一个指针,它不必在这个例子中,如果不是这样的话,它可能会更容易理解;所以考虑改变它。
现在scanf()
采用格式字符串,并且每个类型的指针都被读取。在你的情况下,你只是读一个int和一个字符串,所以你有:
scanf("%d",data1.ID);
scanf("%s",data1.Name);
很好,请注意,如果您选择将ID
更改为int
而不是指针,则需要传递其地址:scanf("%s",&data1.ID);
printf()
采用格式字符串,以及要打印的格式的数据。在你的情况下:
printf("The new ID is \n",&data1.ID); // you're giving the address of the int
printf("The name input is \n",&data1.Name); // and the address of the string
但是你没有提供任何格式......并且你不想发送指针的地址,这没有意义。
printf("The new ID is %d\n",*data1.ID); // %d for an int, and * to dereference
printf("The name input is %s\n",data1.Name); // %s for a string
你想要做的是相应地使用%d
和%s
作为int和字符串(就像使用scanf()
一样)但是因为ID
是一个指针,你在将其传递给printf()
之前需要取消引用它。 C中没有“字符串”类型,因此当您告诉printf()
期望字符串时,它只需要char *
,而data1.Name
已经是{{1}}。