在C结构中存储字符串
作为一个计算机科学家庭作业,我被要求做一个在下面使用这个代码的算法。问题是,Name struct中的字符串作为指针存储,因此当我获得下一个输入时,所有字符串都是相同的,这破坏了我完整代码的功能在C结构中存储字符串,c,string,memory-management,struct,C,String,Memory Management,Struct,作为一个计算机科学家庭作业,我被要求做一个在下面使用这个代码的算法。问题是,Name struct中的字符串作为指针存储,因此当我获得下一个输入时,所有字符串都是相同的,这破坏了我完整代码的功能 #包括 #包括 #包括 #定义默认值_第5章 #定义成功1 #定义故障0 #定义最大行数100000 typedef结构名 { 字符*字符串; }姓名; 名称*initializeName(字符*InputName) { Name*Name=calloc(1,sizeof(Name)); if(name
#包括
#包括
#包括
#定义默认值_第5章
#定义成功1
#定义故障0
#定义最大行数100000
typedef结构名
{
字符*字符串;
}姓名;
名称*initializeName(字符*InputName)
{
Name*Name=calloc(1,sizeof(Name));
if(name!=NULL)
{
名称->字符串=输入的名称;
}
返回名称;
}
无效打印名(名称*名称){
printf(“名称->%s\n”,名称->字符串);
}
int main(){
姓名**姓名;
对于(int i=0;i<3;i++){
字符串[100];
scanf(“%s”,字符串);
名称[i]=初始值设定名称(字符串);
对于(int j=0;jstring)是否存储为字符串
name->string = inputedName;
不复制字符串。您需要strdup
name->string = strdup(imputedName);
在分配了结构名称之后,可以继续分配空间来存储字符串本身的副本:
if (name != NULL)
{
/* +1 for null terminator at end of string */
size_t string_length = strlen(inputedName) + 1;
name->string = calloc(string_length, 1);
如果成功,则可以将字符串复制到新分配的空间中(如果失败,则需要释放struct Name
allocated):
main()
Name**Name;
是指针,但它还没有指向任何地方,因此无法访问Name[i]
。您的for()
循环只能从Name[0]
访问Name[2]
,因此将定义更改为三个Name*
指针的数组将修复它:
Name *name[3];
不要只复制指针(name->string=inputedName
);分配新存储并复制字符串内容。@n.m.我无法解决引用问题的问题。虽然它们表面上可能有关联,但我相信它们处理不同的情况。@bigdataolddriver:不是。他上面已经有一个calloc
两行了。@bigdataolddriver是正确的-他所指的错误在main
,其中声明了Name**Name;
,并且Name[i]
然后在没有内存分配的情况下被访问。哦,是的,在接受@joshua调用calloc
的解释后,我有一种奇怪的感觉。我一遍又一遍地上下查看,直到@caf指向oute。即使在初始化数组并使用strdup之后,字符串仍然是唯一的same@victormoraesgs:正如caf已经指出的那样这里有一个打字错误printName(name[i]);
shold读printName(name[j])
。即使在进行了这些更改之后,名称数组中的字符串仍然是相同的。下面是它是如何发生的:string1
outputsName->string1
|string2
outputsName->string2
@victormoraesgs:更改之后,每个Name
中的字符串都是不同的,但是您的循环总是打印相同的字符串,因为它在j
上循环,但打印name[i]
。
Name *name[3];