如下面的代码表示,“'读取'系统调用无法在Windows中使用C语言正常工作。
#include <fcntl.h>
#include <windows.h>
#include <stdio.h>
int main()
{
int fd = open("a.txt",O_RDONLY);
char *buf = (char *)malloc(4);
read(fd,buf,4);
printf("the string is %s\n",buf);
return 0;
}
非常简洁的c代码,a.txt的内容是&#39; abcd&#39;。但是当我在windows中运行此代码时(env是MinGW,编译器是gcc)。输出是
abcd?
什么是角色&#34;?&#34;在这个输出字符串?
我可以使用&#34;阅读&#34;或&#34;写&#34; windows中的unix系统调用?
感谢提前。
答案 0 :(得分:4)
该问题与平台或操作系统无关。这只是你错过了字符串终结符。
在C中,char
字符串实际上称为 以空值终止 字节字符串。 以null结尾的位非常重要,因为所有将char
指针作为字符串处理的函数都会查找此终结符以了解字符串何时结束。
这意味着一个包含四个字符的字符串实际上需要空间用于五个,最后一个字符是空终结符字符'\0'
。
如果没有终止符,字符串函数可以并且将会越界寻找终结符,从而导致undefined behavior。
所以:
char buf[5]; // 4 + 1 for terminator
int size = _read(fd, buf, 4); // Windows and the MSVC compiler doesn't really have read
// _read (as well as the POSIX read) returns -1 on error, and 0 on end-of-file
if (size > 0)
{
buf[size] = '\0'; // Terminate string
printf("the string is %s\n", buf);
}