打印字符数组垃圾

#include<sys/stat.h> #include<stdio.h> #include<fcntl.h> #include<sys/types.h> int main() { int n,i=0; int f1,f2; char c,strin[100]; f1=open("data",O_RDWR|O_CREAT|O_TRUNC); while((c=getchar())!='\n') { strin[i++]=c; } strin[i]='\0'; write(f1,strin,i); close(f1); f2=open("data",O_RDONLY); read(f2,strin,0); printf("\n%s\n",strin); close(f2); return 0; } 

这个代码在一些机器上工作得很好,而在其他机器上打印出垃圾,如何使它在所有机器上正常运行?

您的read()函数实际上并没有读取任何内容。 第三个参数是要读取的最大字节数,并且你传递它0:

 read(f2,strin,0); 

你需要传递缓冲区的大小,减去一个来容纳一个终止的nul字节:

 int bytesread = read(f2,strin,99); /* since your buffer is size 100 */ strin[bytesread] = '\0'; 

这是有史以来唯一的原因是因为你没有清除之间的第一次通过getchar()和第二次当你读()到它之间的限制。 所以当你看到数据的时候,这是第一次剩下的数据。 如果你添加一个:

 memset(strin, 0, 100); 

到read()之前的原始代码,您将看到它从不在任何机器上打印数据。

我认为这个问题是一个简单的问题,当你使用getchar()来获取字符直到'\ n'时,你实际上并没有将Windows回车计为\ r \ n,而在Unix中是\ n。在下面的链接

Windows回车\ r \ n是由两个字符还是一个字符组成?

PS我在这里是一个新手,所以如果这个答案不是你正在寻找的,我很抱歉。

你写的代码不能正常工作! 问题很简单! 或者你写,然后你也读取字符串末尾的\ x0,或者当你读到的时候,把\ x0加到读取字符串的末尾! 🙂

另存\ x0

 write(f1,strin,i+1); 

阅读并添加\ x0

 i=read(f2,strin,sizeof(strin)-1); strin[i]=0; 

我认为最好的解决方案是第二个!)