在指向结构的指针数组中填充字符串

时间:2016-03-18 17:33:42

标签: c arrays pointers struct

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

示例运行:

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

编程接收信号SIGSEGV,分段故障。 在struct.c:51的getParty(p = 0x0)中的0x00000000004009a4 51 scanf("%s",p-> firstName); (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;
}

1 个答案:

答案 0 :(得分: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]));