c 中的字符串和字符串指针有问题。在一个结构中,字符串似乎被限制为 3 个字符长;[关闭]

Problem with strings and string pointers in c. Strings seem to be capped to 3 characters long in a struct; [closed]

提问人:Justin_Doesn't_Understand 提问时间:11/17/2023 最后编辑:Justin_Doesn't_Understand 更新时间:11/17/2023 访问量:41

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

2天前关闭。

在 addPerson() 函数中,人群中一个人的名字似乎被限制为 3 个字符,否则它将显示前 4 个字符,后跟一些随机的 ascii 字符。我认为解决方案非常基本,但我仍在努力获得它。

最初,我让用户在主函数中输入人员的详细信息,因为我认为字符串的长度在解析函数时被限制了,但现在我认为这与存储分配有关。因此,理想情况下,我会让用户在主函数中输入人员的详细信息。 忽略 read() 和 write() 函数,一旦名称排序,它们就会出现

代码如下:

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

struct homosapien{
    char *name;
    int age;
    char sex;
    struct person *nextPtr;
};

typedef struct homosapien person;
typedef person *personPtr;

void write();
void read();
void addPerson(personPtr *crowd);
void deletePerson(personPtr *crowd, int num);
void printPeople(personPtr crowdPtr);
void instructions();

int main()
{
    personPtr *crowd = NULL;
    //read(*crowd);
    //printPeople(crowd);
    instructions();
    char choice;

    scanf("\n%c", &choice);

    while(choice != '4'){

        switch (choice){
        case '1':
            addPerson(&crowd);
            break;

        case '2':
            if(crowd != NULL){
                int num = 1;
                personPtr temp = crowd;
                while(temp != NULL){
                    printf("\n%d  - %s", num, &temp->name);
                    temp = temp->nextPtr;
                    num++;
                }

                puts("\nEnter the number of the target");
                scanf("%d", &num);

                deletePerson(&crowd, num);
            }
            else puts("No-one to shoot");

            break;
        case '3':
            write();
            exit(0);
            break;
        default:
            puts("Not a valid option please try again");
            break;
        }

        printPeople(crowd);
        instructions();
        scanf("\n%c", &choice);
    }

    return 0;
}

void instructions(){
    printf("What do you want to do?\n"
           "    1: Add a person to the crowd\n"
           "    2: Assassinate someone\n"
           "    3: Save and exit\n"
           "    4: Quit without saving\n");
}

void printPeople(personPtr crowd){
    personPtr temp = crowd;
    if(crowd == NULL){
        puts("Damn, its empty here");
    }
    else{
        puts("The people in the crowd are:");

        while(temp != NULL){
            printf("Name :   %s\n"
                   "Age  :   %d\n"
                   "Sex  :   %c\n\n", &temp->name, temp->age, temp->sex);
            temp = temp->nextPtr;
        }
        puts("");
    }
}

void addPerson(personPtr *crowd){
    char *name;
    char sex, gway;
    int age;

    puts("Enter the person's name");
    scanf("%c", &gway);
    scanf("%[^\n]", &name);
    puts("Enter the person's age");
    scanf("\n%d", &age);
    puts("Enter the person's sex (m/f)");
    scanf("\n%c", &sex);

    personPtr temp = malloc(sizeof(person));

    temp->age = age;
    temp->sex = sex;
    temp->name = name;
    temp->nextPtr = NULL;

    temp->nextPtr = *crowd;
    *crowd = temp;
}

void deletePerson(personPtr *crowd, int num){
    personPtr currPtr = *crowd;
    personPtr prevPtr = NULL;

    if(num == 1){
        currPtr = *crowd;
        free(currPtr);
        *crowd = (*crowd)->nextPtr;
    }
    else{
        for(int i = 0; i < num - 1; i++){
            prevPtr = currPtr;
            currPtr = currPtr->nextPtr;
        }
        prevPtr->nextPtr = currPtr->nextPtr;
        printf("%d neutralized", &currPtr->name);
        free(currPtr);
    }
}

void write(personPtr crowd){
    personPtr currPtr = crowd;

    while(currPtr != NULL){
        //fprintf("%s\n", &currPtr->name);
        //fprintf("%d\n", currPtr->age);
        //fPrintf("%c\n", currPtr->sex);
    }
}
C 指针

评论


答: 暂无答案