c - 努力从 C 中的结构中打印值

标签 c structure

我在使用 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/

相关文章:

c - 删除 C 中的部分字符串(正则表达式?)

c - 嵌入式c编程

c++ - 为什么 visual studio code C/C++ 扩展会安装 mono 框架程序集?

计算一个数组的平均值,返回值是废话

c# - "using"命名空间声明中的语句位置

具有内部 Clear() 方法的 C# 结构

C符号常量+结构

configuration - gradle 的 buildSrc 文件夹的目的是什么?

c - 如何在 C 中翻转一个字节中的特定位?

c - 如何输入结构指针