提问人:Justin_Doesn't_Understand 提问时间:11/17/2023 最后编辑:Justin_Doesn't_Understand 更新时间:11/17/2023 访问量:41
c 中的字符串和字符串指针有问题。在一个结构中,字符串似乎被限制为 3 个字符长;[关闭]
Problem with strings and string pointers in c. Strings seem to be capped to 3 characters long in a struct; [closed]
问:
在 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);
}
}
答: 暂无答案
评论