gpt4 book ai didi

C字符串问题

转载 作者:太空宇宙 更新时间:2023-11-04 05:31:43 24 4
gpt4 key购买 nike

我的问题很简单,但我真的不知道如何在C中操作字符串

问题是:我有一个名为 person 的结构

struct person
{
char name[25] // use char *name better?
}p;

我还有一个函数叫做p *addNewPerson(char *name)

p *addNewPerson(char *name)
{
p *newPerson = (p *)malloc(sizeof(person));
//here how can I assign the name to this new person?
...
return newPerson;
}

所以,在main函数中

void main()
{
for(; ;)
{
char input[25];
scanf("%s", input); // is this way possible?
//shoud I do something with this "input", like input[strlen(input)-1] = '\0'
//call addNewPerson()
p *newPerson = addNewPerson(&input);
//store this newPerson in some data structure
...
}
}

澄清:问题是如何在 p *addNewPerson(char *name) 中为这个新人分配名字?

最佳答案

p *newPerson = (p *)malloc(sizeof(person));
//here how can I assign the name to this new person?

你会这样做:

strcpy(p->name,name);

您还应该更改对 p 的使用至 struct personp不是类型,它是 struct person 类型的全局变量.将代码更改为:

struct person *addNewPerson(char *name)
{
struct person *newPerson = malloc(sizeof *newPerson);

//shoud I do something with this "input", like input[strlen(input)-1] =

不,scanf 将为您终止字符串。

但请注意,C 中的字符串处理需要非常非常小心。例如当你做 scanf("%s", input); , 如果您输入的名称超过 24 个字符会怎样?

任何事情都可能发生。 scanf 可能会溢出你的缓冲区,你会得到未定义的行为。你至少应该这样做:

  int ret = scanf("%24s",buffer);  //read max 24 chars, to make space for a final '\0'
if(ret == EOF) { //end of input reached.
break;
if(ret != 1) {
// for whatever reason, the conversion failed. exit, or alert the user, or whatever
}

同样在你的addNewPerson里面在 strcpy(p->name,name); , strcpy 可能会愉快地写过去name 的缓冲区比 p->name 长能把持住。在这种特殊情况下,通过对 scanf 进行上述修改,长度将始终为 24 或更小,因此是安全的。但总体上要非常清楚这一点。

对 addNewPerson 的调用应该只传递 buffer 的名称直接地,当用作值时,数组的名称衰减为指向该数组第一个元素的指针;

 struct person *newPerson = addNewPerson(input);

newPerson是用 malloc() 动态分配的,记住当你不再需要它时释放它。否则你会泄漏内存。

关于C字符串问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671727/

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