gpt4 book ai didi

c - 将字符串填充到结构体指针数组中

转载 作者:行者123 更新时间:2023-11-30 20:36:25 26 4
gpt4 key购买 nike

我正在复习 C 中的指针,并为自己创建一些练习。我认为通过结构指针数组读取某些结构,然后显示并排序该数组会很好。我觉得我遇到的问题是相当基本的。下面的代码读取第一个条目,但firstName 字符串始终为空。打印第一个结构并继续第二个结构后,它会在读入firstName字符串时“boom”。我以为我在 initParty() 中正确初始化了字符字符串,所以我不确定这里的问题是什么。有任何想法吗?

示例运行:

*(gdb) 运行启动程序:/home/remnux/C/struct输入名字:约翰输入姓氏: smith输入ssn:1234(空)史密斯,1234

程序收到信号 SIGSEGV,段错误。struct.c:51 处的 getParty (p=0x0) 中的 0x00000000004009a451 scanf("%s", p->名字);(gdb)*

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

struct person{
char *firstName;
char *lastName;
int ssn;
};

void print(struct person* p){
printf("\n%s ", p->firstName);
printf("%s, ", p->lastName);
printf("%d\n ", p->ssn);
}

bool isGreaterThan(struct person *p1, struct person *p2){
return (strcmp(p1->firstName > p2->firstName) > 0)
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) > 0))
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) == 0)) && (p1->ssn - p2->ssn > 0);
}

void printArray(struct person** parray, int size){
int i;
for(i = 0; i < size; i++)
printf("%s %s, %d", parray[i]->firstName, parray[i]->lastName, parray[i]->ssn);
}

void sort(struct person** parray, int size){
int i, j;
for(i = 0; i < size; i++)
for(j = 0; j < size-1; j++){
if(isGreaterThan(parray[j], parray[j+1])){
struct person *temp = parray[j];
parray[j] = parray[j+1];
parray[j+1] = temp;
}
}
return;
}

void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}

void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}

int main(){
int i, ch, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
sort(parray, size);
printArray(parray, size);
}

在使用 -Wall 编译时消除警告后进行编辑:

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

struct person{
char *firstName;
char *lastName;
int ssn;
};

void print(struct person* p){
printf("\n%s ", p->firstName);
printf("%s, ", p->lastName);
printf("%d\n ", p->ssn);
}

/*bool isGreaterThan(struct person *p1, struct person *p2){
return ((strcmp(p1->firstName > p2->firstName) > 0)
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) > 0))
|| ((strcmp(p1->firstName > p2->firstName) == 0) && (strcmp(p1->lastName > p2->lastName) == 0) && (p1->ssn - p2->ssn > 0)));
}*/

void printArray(struct person** parray, int size){
int i;
for(i = 0; i < size; i++)
printf("%s %s, %d", parray[i]->firstName, parray[i]->lastName, parray[i]->ssn);
}

/*void sort(struct person** parray, int size){
int i, j;
for(i = 0; i < size; i++)
for(j = 0; j < size-1; j++){
if(isGreaterThan(parray[j], parray[j+1])){
struct person *temp = parray[j];
parray[j] = parray[j+1];
parray[j+1] = temp;
}
}
return;
} */

void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}

void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}

int main(){
int i, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
//sort(parray, size);
printArray(parray, size);
return 0;
}
return;
} */

void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}

void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}

int main(){
int i, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
//sort(parray, size);
printArray(parray, size);
return 0;
}
return;
} */

void initParty(struct person *p){
p = (struct person*)malloc(sizeof(struct person));
p->firstName = (char*)malloc(100 * sizeof(char));
p->lastName = (char*)malloc(100 * sizeof(char));
}

void getParty(struct person *p){
int ch;
printf("\nEnter the firstname: ");
scanf("%s", p->firstName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the lastname: ");
scanf("%s", p->lastName);
while((ch = getchar()) != '\n' && ch != EOF);
printf("\nEnter the ssn: ");
scanf("%d", &(p->ssn));
while((ch = getchar()) != '\n' && ch != EOF);
}

int main(){
int i, size = 2;
// printf("Input the number of people you wish to enter: ");
// scanf("%d", &size);
// while((ch = getchar()) != '\n' && ch != EOF);
struct person *parray[size];
for(i = 0; i < size; i++){
initParty(parray[i]);
getParty(parray[i]);
print(parray[i]);
}
//sort(parray, size);
printArray(parray, size);
return 0;
}

最佳答案

由于贡献都是评论而不是答案,我想我会自己回答这个问题。问题是我将指向结构的指针传递给函数,因此该结构正在修改本地指针副本,因为 C 是按值传递的。如果希望修改指向的对象,则必须引用该指针,以便在函数内部引用时可以修改主对象。以下更改达到了目的:

void initParty(struct person **p){
*p = (struct person*)malloc(sizeof(struct person));
(*p)->firstName = (char*)malloc(100 * sizeof(char));
(*p)->lastName = (char*)malloc(100 * sizeof(char));
}

还有电话:

  initParty(&(parray[i]));

关于c - 将字符串填充到结构体指针数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36090797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com