c - 如何在链表的结构中使用字符串?
问题描述
在我的代码中,我有 2 个名为villa
和的结构apartment
。他们有 type 的成员char*
。当在我的 void 记录中,我从用户那里得到结构的其他部分,比如villa1.price
(它是浮点数),它可以工作,但是当涉及到时char*
,我无法使用scanf("%s",&villa1.city
)读取字符串,所以我使用了另一个名为的字符数组v1
来获取信息用户,然后使用villa1.city=a1
.将其分配给 villa1.city
这是第一次工作,但我想制作一个链表。我第一次发送villa1.city
以insertFirstVilla
将其添加到链表时它可以工作,但是当我添加第二个节点时,villa1.city
第一个节点丢失并且每次添加新节点时都会发生这种情况。
当我将第二个节点添加到我的列表中时,我如何从用户那里获取数据,villa1.price
或者如果无法以数据保持安全的方式复制它。我发布了我的代码的一部分villa
,但代码是相同的apartment
。
struct villa
{
float built;
float garden;
float price;
int floors;
char* city;
char* ST;
char* alley;
char* postal_code;
}villa1;
struct nodev
{
villa info;
nodev* next;
}*headv = NULL;
void insertFirstvilla(float built, float garden,float price,int floor, char*city) {
nodev* link = (nodev*)malloc(sizeof(nodev));
link->info.built = built;
link->info.garden = garden;
link->info.price = price;
link->info.floors = floor;
link->info.city = city;
link->next = headv;
headv = link;
}
void record()
{
char a;
printf("is the building apartment? (y/n):");
scanf("%c", &a);
char a1[100];
char v1[100];
if (a == 'y')
{
/* printf("enter apartment features:");
printf("\nenter built area:");
scanf("%f", &apart.built);
printf("\nenter basic price:");
scanf("%f", &apart.price);
printf("\nenter floors number:");
scanf("%d", &apart.floor_no);
printf("\ndoes apartment have elavator(if there is no elavotor enter zero else enter one):");
scanf("%d", &apart.elevator);
printf("\nenter city:");
scanf("%s", &a1);
apart.city = a1;
insertFirstapartment(apart.built, apart.price, apart.floor_no, apart.elevator,apart.city);
writetofilea(apart.built, apart.price, apart.floor_no, apart.elevator, apart.city);*/
}
else if (a == 'n')
{
printf("enter villa features:");
printf("\nenter built area:");
scanf("%f", &villa1.built);
printf("\nenter garden area:");
scanf("%f", &villa1.garden);
printf("\nenter basic price:");
scanf("%f", &villa1.price);
printf("\nenter floors number:");
scanf("%d", &villa1.floors);
printf("\nenter city:");
scanf("%s", &v1);
apart.city = v1;
insertFirstvilla(villa1.built, villa1.garden, villa1.price, villa1.floors, villa1.city);
writetofilev(villa1.built, villa1.garden, villa1.price, villa1.floors, villa1.city);
}
getchar();
}
int main()
{
int t = 0;
while (t<4)
{
record();
t++;
}
}
解决方案
以阅读城市为例:
char a1[100];
scanf("%99s", a1); // an array will be passed as an address, so no need for &
apart.city = malloc(strlen(a1)+1); // ask for memory
strcpy(apart.city, a1); // copy it
或使用strdup
,它为您执行此操作:
char a1[100];
scanf("%99s", a1); // an array will be passed as an address, so no need for &
apart.city= strdup(a1); // get memory and copy it
推荐阅读
- ios - Vue 站点的 Webpack url-loader PDF 数据 URI 链接在 iOS 14 中停止工作
- java - Java EntityManager 抛出 NullPointerException
- c++ - 没有匹配的函数调用...(使用模板和指针)
- c# - 如何在测试 ASP.NET Core 应用程序时使用 EF Core 使用 InMemory 数据库将数据播种到 DbContext?
- python - 如何在绘图内放大
- vue.js - 如何使用带有数组长度的 v-if
- python - 从创建的列表中过滤数据
- python - 为什么“find()”方法只返回第一个值?我怎样才能得到所有的值?
- c - 数组替换我不想要的元素
- wordpress - 如何正确使用 ngrok 隧道以获得最佳工作流程与 wordpress 和 docker compose yml