【问题标题】:C - Writing char arrays to a fileC - 将字符数组写入文件
【发布时间】:2016-11-03 22:55:41
【问题描述】:

我有以下结构:

struct visitordata {
    char name[25];
    char email[25];
    int id;
    char reg_time[9];
};

我想将这些访问者的数据写入文件。我正在从 CLI 读取这些数据:

int main(int argc, char** argv)
{
    struct visitordata mydata;
    char name[25], email[25], eventid[10], c;
    printf("Enter name: ");
    scanf("%s", name);
    strcpy(mydata.name, name);
    //etc.
}

现在当我尝试写入文件时:

lseek(handle, -sizeof(mydata.name), SEEK_END);
fputs(handle, &mydata.name);  

这会写入用户输入的输入,但也有些乱码,因为我分配了char name[25]

从命令行读取后如何分配 char 数组大小?我对此很陌生,请不要苛刻。谢谢!

【问题讨论】:

  • 您只为名称保留 25 个字符。如果用户输入更长,那么您将写入不属于您的内存(缓冲区溢出)。在您的结构中,您可以使用mydata.name = new char(strlen(name)+1) 分配动态长度字符串。但是您也应该保证,不要从name 中读取更多字符,因为您首先为它保留了字符。例如。通过使用strncpy 而不是strcpy。并且可能保留的不仅仅是 25 个字符。还要确保字符串以 '\0' 结尾。
  • 如果可以的话,你不应该在 C 中做这些任务,因为你有很多机会射中自己的脚。考虑 Java 或 Go,它们可以保护您免受缓冲区溢出和其他内存损坏、格式字符串攻击、堆分配错误等等。一旦你变得更有经验,如果你真的想的话,你可以切换到 C。
  • 我必须用 C 来做...
  • @RolandIllig - 为什么建议使用不相关的语言?你会告诉内核开发人员用 java 编写代码吗?
  • @cwschmidt 好的,我可以将mydata.name 分配为new char(strlen(name)+1)。但是在这种情况下,我如何在结构中声明它?我不能在所有三个字符串上都做char name[];。另外,如何为scanf("%s", name); 声明name,使其与用户输入一样大?

标签: c file


【解决方案1】:
struct visitordata mydata;

memset(mydata, 0, sizeof mydata);

if (scanf("%24s %24s", mydata.name, mydata.email) == 2) {
    ...
}

memset00 字节填充mydata,以便您的文件不包含随机数据。

将数组传递给函数时,实际上只传递了指向其第一个元素的指针,这正是scanf 所期望的。请注意,要阅读int,您必须编写:

if (scanf("%d", &mydata.id) == 1) {
    ...
}

【讨论】:

  • 在这种情况下,您不想用空值填充整个结构。里面有一个整数!此外,您的 sizeof 语法是错误的。您需要将 mydata 括在括号中。
  • C++ 无关,但文档仅存在于 C++ 中。我很想找到等效的 C 文档。
  • 我也删除了 C++ 参考。这是 C 文档gnu.org/software/gnu-c-manual/…
  • 在该页面的最后,有一个指向 C 文档的链接。或者,您可以将 URL 中的 cpp 替换为 c
【解决方案2】:

使用strlen(name) 获取名称中有多少个字符。

【讨论】:

  • 自从我宣布它是 char name[25] 之后,将会有 25 个。
  • 错了。如果 name 不是以 null 结尾的,strlen() 将不会返回正确的长度。最好强制 scanf() 只接受 25 个字符,包括空终止符。
猜你喜欢
  • 2013-07-19
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多