打印字符数组垃圾

时间:2015-04-21 15:40:00

标签: c linux string pointers

#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;
}

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

3 个答案:

答案 0 :(得分:2)

您对read()的调用实际上并没有读取任何内容。第三个参数是要读取的最大字节数,并且您将其传递给0:

read(f2,strin,0);

您需要将缓冲区的大小传递给它,减去一个以容纳终止的nul字节:

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

这是有效的唯一原因是因为你没有在第一次通过getchar()填充它和第二次读取()时清除strin。因此,当您看到数据时,它是第一次剩余的数据。如果添加:

memset(strin, 0, 100);

到read()之前的原始代码,你会发现它从不在任何机器上打印数据。

答案 1 :(得分:0)

我认为这个问题很简单,当你使用getchar()来获取字符直到'\ n'时,你实际上并没有考虑到 Windows回车是\ r \ n,而它在Unix中是\ n 您将在下面的链接中获得详细信息

Does Windows carriage return \r\n consist of two characters or one character?

P.S。我是新来的,所以如果这个答案不是你想要的话,我会事先道歉。

答案 2 :(得分:0)

您编写的代码无法正常工作!问题很简单!或者你写,然后你也读到字符串末尾的\ x0,或者,当你读,你将\ x0添加到读取字符串的末尾! :)

还保存\ x0

write(f1,strin,i+1);

阅读并添加\ x0

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

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