Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印字符数组垃圾 #包括 #包括 #包括 #包括 int main() { int n,i=0; int f1,f2; char c,strin[100]; f1=开放(“数据”,O|RDWR | O|CREAT | O|TRUNC); 而((c=getchar())!='\n') { strin[i++]=c; } strin[i]='\0'; 书写(f1,strin,i); 关闭(f1); f2=打开(“数据”,仅限Ordu); 读取(f2,strin,0); printf(“\n%s\n”,strin); 关闭(f2); 返回0; }_C_Linux_String_Pointers - Fatal编程技术网

打印字符数组垃圾 #包括 #包括 #包括 #包括 int main() { int n,i=0; int f1,f2; char c,strin[100]; f1=开放(“数据”,O|RDWR | O|CREAT | O|TRUNC); 而((c=getchar())!='\n') { strin[i++]=c; } strin[i]='\0'; 书写(f1,strin,i); 关闭(f1); f2=打开(“数据”,仅限Ordu); 读取(f2,strin,0); printf(“\n%s\n”,strin); 关闭(f2); 返回0; }

打印字符数组垃圾 #包括 #包括 #包括 #包括 int main() { int n,i=0; int f1,f2; char c,strin[100]; f1=开放(“数据”,O|RDWR | O|CREAT | O|TRUNC); 而((c=getchar())!='\n') { strin[i++]=c; } strin[i]='\0'; 书写(f1,strin,i); 关闭(f1); f2=打开(“数据”,仅限Ordu); 读取(f2,strin,0); printf(“\n%s\n”,strin); 关闭(f2); 返回0; },c,linux,string,pointers,C,Linux,String,Pointers,这段代码在某些机器上运行得很好,而在其他机器上打印垃圾,如何使它在所有机器上正确运行 我认为这是一个简单的问题,当您使用getchar()获取字符直到“\n”时,实际上您没有考虑 Windows回车在Unix中\r\n时为 您将在下面的链接中获得详细信息 另外,我是这里的新手,所以如果这个答案不是您想要的,我在此道歉。您编写的代码工作不正常!问题很简单!或者您先写入,然后再读取字符串末尾的\x0,或者在读取时,将\x0添加到读取字符串的末尾!:) 还保存\x0 #include<sys/

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

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


另外,我是这里的新手,所以如果这个答案不是您想要的,我在此道歉。

您编写的代码工作不正常!问题很简单!或者您先写入,然后再读取字符串末尾的\x0,或者在读取时,将\x0添加到读取字符串的末尾!:)

还保存\x0

#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;
}
阅读并添加\x0

write(f1,strin,i+1);
我认为最好的解决方案是第二个

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

i=read(f2,strin,sizeof(strin)-1);
strin[i]=0;
您需要将缓冲区的大小传递给它,减去1以容纳终止的nul字节:

read(f2,strin,0);
唯一的原因是,第一次通过getchar()填充它和第二次读取()之间没有清除strin。因此,当您看到数据时,它是第一次看到的剩余数据。如果您添加了一个:

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

在读取()之前,您将看到原始代码从未在任何机器上打印数据。

请先检查
open()
的返回值是否成功。即使我省略了文件访问部分,即仅填充字符串,然后再次打印,我仍然会得到相同的结果。您是否尝试过格式化I/o?即“man-S2读取”说明:DESCRIPTION read()尝试从文件描述符fd向缓冲区读取多达个字节,从buf开始。如果count为零,read()将返回零,并且没有其他结果。如果count大于SSIZE_MAX,则结果是未指定的。但是我尝试了这段代码,并且read(),也使用count==0,返回读取字节数!!!我向您发出信号,我在上面指出的奇怪情况是由于我没有清理缓冲区!奇怪的是,在我的ubuntu上,函数read()的读取值也是count==0。。。我读到一个人说计数器0 read()什么都不做!!!但是我试着在上面的代码中使用read,它可以读取!你确定吗?尝试在read()之前使用memset擦除缓冲区,看看它是什么样子。当我这样做时,很明显read()什么也没做。如果你不先把strin擦掉,你可能会看到它以前的内容,误以为是read()把它放在那里的。我已经照你说的做了!不清理缓冲区是我的错误!你在这一点上完全正确……但是问题是我试图省略所有的文件访问函数,即只填充字符串并按原样打印它……并且仍然在某些机器上打印垃圾。你可以在删除文件访问函数的情况下共享代码,以便我们可以确切地看到你在做什么?
memset(strin, 0, 100);