【发布时间】: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,使其与用户输入一样大?