C - 将用户输入存储在动态char数组中?

时间:2016-11-04 10:50:40

标签: c file

我想从用户那里读取一些字符串输入并将其写入文件。现在我正在做

char name[25];
scanf("%s", name);
int handle = open("./visitors.txt", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
if (handle < 0){
   printf("File error.\n");
   return;
}
lseek(handle, -sizeof(name), SEEK_END);
write(handle, name, sizeof(name));

这当然是不对的,因为大多数时候用户不写25个字符,只有更少,所以当用户输入5个字符时,另外20个将是空的,我最终有5个字符用户输入和输出文件中的20个字符乱码。如何确保只将用户输入写入文件?

2 个答案:

答案 0 :(得分:1)

我不确定您要使用低级别系统调用openlseekwrite的原因。通常,使用标准C fopenfscanffprintf函数来执行此类任务会更加方便。

在这种情况下,您可以尝试fgetsstdin获取字符串输入,然后使用fprintf%s来写入文件。您仍然可以使用缓冲区name[25]name[100](设想来自stdin的最大输入)。只需正确初始化它以确保它的NULL终止。然后使用fprintf %s将正确的字符串(即没有乱码结尾)写入文件。

答案 1 :(得分:1)

您正在使用原始系统调用来处理文件操作。除非您的目的是专门了解系统调用,否则您不应该这样做。 The write call写入第三个参数指定的字节数。 sizeof(name)在这种情况下是错误的。它将返回字符串的长度,它将返回整个缓冲区的长度。

标准strlen function为您提供字符串长度。因此,如果用户输入5个字符,则运行strlen(name)将为您提供5个字符,与您使用的sizeof不同。

除非您想要专门了解系统调用,否则您应该使用C标准库处理文件操作,使用fprintf输出到文件,以及fopen和{{1}等函数}。看看at the fprintf docs,它也链接到其他功能。