C语言 设置char指针指向char数组的返回值



尝试学习c语言。为此,我编写了一个程序来创建一个麻烦票报告。系统提示用户输入优先级、名称和问题。我使用一个结构体来存储数据并创建一个击打数组。现在我在开发代码时使用数组方法。最后,我将使用链表。

无论如何,get_input()函数读入用户输入并返回一个char指针。包括get_input()和create_ticket()函数。
#define NUM_TICKETS 10
char* get_input(int maxlen)
{
static char s[110];
char ch;
int i = 0;
int chars_remain = 1;
while (chars_remain)
{
ch = getchar();
if ((ch == 'n') || (ch == EOF))
{
chars_remain = 0;
}
else if (i < maxlen - 1)
{
s[i] = ch;
i++;
}
}
s[i] = '';
return s;

void create_ticket()
{
struct ticket
{
int priority;
int number;
char * name;
char * problem ;
char * assigned_to;
char * status ;
};
struct ticket tkt_array[NUM_TICKETS];
struct ticket new_ticket;

printf("Enter your name: ");
new_ticket.name = get_input(20);
printf("new_ticket.name: %s n", new_ticket.name);

printf("Enter problem description: ");
new_ticket.problem = get_input(100);
printf("new_ticket.problem: %s n", new_ticket.problem);

printf("Assigned to: ");
new_ticket.assigned_to = get_input(20);
printf("new_ticket.assigned_to %sn ", new_ticket.assigned_to);

printf("Enter ticket status: ");
new_ticket.status = get_input(10);
printf("new_ticket.status: %s n", new_ticket.status);

}

我注意到初始输入被正确读取和显示,但随后的输入覆盖了先前的输入。

例如,输入name后,显示输入的值

printf("Enter your name: ");
new_ticket.name = get_input(20);
printf("new_ticket.name: %s n", new_ticket.name);

但在输入问题描述后,将new_ticket.name更改为显示问题描述文本。我花了一段时间才弄清楚问题是get_char()中的返回s。它返回一个指针。地址是相同的,但值改变了,并且struct票据指针指向get_char()的返回值的相同地址。我如何将返回值保存在一个变量中,而不是在随后调用get_input时重置它?s是一个字符*,我怎么能保存在一个变量指针的返回值?

printf("Enter problem description: ");
new_ticket.problem = get_input(100);
printf("new_ticket.problem: %s n", new_ticket.problem);
printf("new_ticket.name: %s n", new_ticket.name);

我如何将返回值保存在一个变量中,而不是在随后调用get_input时重置它?s是一个字符*,我怎么能保存在一个变量指针的返回值?我希望我把问题讲清楚了。

此答案仅针对问题中所述的问题,而不针对代码中的其他错误或问题。

你的函数get_input使用单个数组static char s[110];来存储输入,并且总是返回该数组的地址。

new_ticket.name = get_input(20);这样的赋值将在所有指针变量中存储相同的地址,因此所有赋值实际上都指向包含最后输入的相同变量s

解决这个问题的一个选择是将结构体中的指针替换为数组,并将其传递给get_input或使用strcpy复制值。

或者您可以使用(非标准)函数strdup来获取输入字符串的动态分配副本。如果此函数不可用,您可以使用mallocstrcpy来实现它。

的例子:

new_ticket.name = strdup(get_input(20));

注意:当使用strdup时,您应该在不再需要时将内存free

或使用strdup:

的替代品
const char *s1;
char *s2;
/* ... */
s1 = get_input(20);
s2 = malloc(strlen(s1) + 1);
if(s2 == NULL)
{
/* handle error */
}
else
{
strcpy(s2, s1);
}
new_ticket.name = s2;

(您可以实现自己的函数来包装mallocstrcpy)

或者用数组代替指针作为结构字段

struct ticket
{
int priority;
int number;
char name[20];
char problem[100];
char assigned_to[20];
char status[10];
};
/* ... */
strcpy(new_ticket.name, get_input(sizeof(new_ticket.name));

static关键字创建一个存在一次的值,因此该函数的多次调用指向相同的数据。

如果你想动态创建一个生命周期由你控制的数据,你可以分配你自己的内存。

malloc(size)将按照提供的大小分配一个内存块。在调用free之前,该内存将一直存在并且有效。

你应该小心,调用free两次,或者忘记调用它,都是c代码中常见的bug来源。

另一种方法是让函数的调用者提供内存。您可以将struct ticket更改为char name[MAX_NAME_LEN],并将函数get输入更新为get_input(int max_len, char * buffer)。这也解决了问题,同时避免了潜在的错误mallocfrees。

最新更新