我在使用 C 语言的结构时遇到了一些麻烦。我认为问题出在指针上。这是我的程序应该做的事情; 读取一个输入数据,比如这样;
Name: Hello
Gender: Male
Age: 60
Name: Hello1
Gender: Male
Age: 13
Name: Hello2
Gender: Female
Age: 10
Name: Hello3
Gender: Male
Age: 20
我希望程序读取“:”后面的单词,例如 Hello 并将该值放入 一个结构。因此,结构的索引[1]应该包含 hello,male,60,例如。
当我在 while 循环内打印值时,它打印得很好。但是当我尝试在 while 循环之外打印结构的值时,它不起作用。我得到这个作为输出;
¿6Q ¿6Q 60
↑ 13
æ £ 10
§☺ ☺ 20
它打印每个元素的年龄,但不打印其他任何元素的年龄。我为此苦苦挣扎了一段时间,不知道为什么会这样。感谢您的帮助; 这是我的代码:
最佳答案
首先,请将作业标记为作业。
其次,正如 Lister 先生所指出的,您将变量 line
分配为 80 个字符长,但您从文件中读取最多 100 个字符 - 对于长行,这会导致问题。您读取的字符数不得超过 79 个字符(在末尾的 \0
处保留 1 个字符)。
现在关于“打印”,我认为您的问题在于以下几行:
p[nameIndex].name = (char*)malloc(sizeof(line));
p[nameIndex].gender = (char*)malloc(sizeof(line));
p[nameIndex].age = (char*)malloc(sizeof(line));
由于 line
本质上是 char *
,因此 sizeof(line)
不会给您期望的结果。相反,您应该使用 strlen
函数 - 不是在这里,而是在复制数据的地方。您的代码应如下所示:
switch(i)
{
case 1:
p[nameIndex].name = (char*)malloc(strlen(tmp) + 1);
strcpy(p[nameIndex].name, temp);
break;
case 2:
p[nameIndex].gender = (char*)malloc(strlen(tmp) + 1);
strcpy(p[nameIndex].gender, temp);
break;
case 3:
p[nameIndex].age = (char*)malloc(strlen(tmp) + 1);
strcpy(p[nameIndex].age, temp);
break;
default:
break;
}
当然,这是假设每个字符占用 1 个字节的存储空间。否则,您应该使用 (strlen(tmp) + 1) * sizeof(char)
来获得正确的分配。
关于c - 努力从 C 中的结构中打印值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521529/