如何读取不确定大小的C字符数组?

如何读取不确定大小的C字符数组?,c,arrays,file,io,character,C,Arrays,File,Io,Character,我尝试了递归和迭代两种方法来解决这个问题,但我一直遇到存储长度不确定的字符串的问题。如果它们是某种库或Api调用,一直读到下一个空白处,这将非常有用 但本质上,我需要创建一个包含字符数组的结构数组。我想这个示例显示了您所寻找的内容。我建议大家玩玩malloc和free来发现它的行为。另外,阅读goto上的评论,除非你真的知道自己在做什么,否则不要使用goto。你可以很容易地失败,很难使用它。一个while循环和一个if来检查缓冲区是否溢出了下一个字符会更好,但是我很懒,所以我保持原样。如果您还有

我尝试了递归和迭代两种方法来解决这个问题,但我一直遇到存储长度不确定的字符串的问题。如果它们是某种库或Api调用,一直读到下一个空白处,这将非常有用


但本质上,我需要创建一个包含字符数组的结构数组。

我想这个示例显示了您所寻找的内容。我建议大家玩玩
malloc
free
来发现它的行为。另外,阅读goto上的评论,除非你真的知道自己在做什么,否则不要使用
goto
。你可以很容易地失败,很难使用它。一个
while
循环和一个if来检查缓冲区是否溢出了下一个字符会更好,但是我很懒,所以我保持原样。如果您还有任何问题,请询问

#include <malloc.h>
#include <string.h>

int main( ) {
  unsigned bufferSize = 0; // our array size
  int i = 0; // current position in buffer
  // we allocate memory for our buffer
  char *buffer = (char *)malloc( bufferSize += 10 );

  int ch = EOF; // set to eof, we will use this to buffer input

  // read input until buffer is full
repeat_input:
  for( ; i < bufferSize; i++ ) { // a while loop would be better for this job...
    ch = fgetc( stdin );
    if( ch == ' ' ) {
      // if there is a space we can break here
      goto done; // this is bad coding practice, i am just a bit lazy now
    }
    buffer[ i ] = ch;
  }

  // keep our old buffer pointer to not create a memleak
  char *old_buffer = buffer;
  buffer = (char *)malloc( bufferSize += 10 );

  // copy content of old buffer to new one
  int k = 0;
  for( k = 0; k <= i; k++ ) {
    buffer[ k ] = old_buffer[ k ];
  }

  // free RAM, else we have a memleak
  free( old_buffer );
  goto repeat_input;

done:
  fputs( buffer, stderr );
  free( buffer );
  return 1;
}
#包括
#包括
int main(){
unsigned bufferSize=0;//我们的数组大小
int i=0;//缓冲区中的当前位置
//我们为缓冲区分配内存
char*buffer=(char*)malloc(bufferSize+=10);
int ch=EOF;//设置为EOF,我们将使用它来缓冲输入
//读取输入,直到缓冲区已满
重复输入:
对于(;i对于(k=0;k我想这个例子说明了你在寻找什么。我建议你玩玩
malloc
free
来发现它的行为。同时阅读goto上的评论,除非你真的知道你在做什么,否则不要使用
goto
。使用它很容易就会失败。使用
while
循环使用If检查缓冲区是否溢出下一个字符会更好,但我很懒,所以我保持原样。如果您还有任何问题,请询问

#include <malloc.h>
#include <string.h>

int main( ) {
  unsigned bufferSize = 0; // our array size
  int i = 0; // current position in buffer
  // we allocate memory for our buffer
  char *buffer = (char *)malloc( bufferSize += 10 );

  int ch = EOF; // set to eof, we will use this to buffer input

  // read input until buffer is full
repeat_input:
  for( ; i < bufferSize; i++ ) { // a while loop would be better for this job...
    ch = fgetc( stdin );
    if( ch == ' ' ) {
      // if there is a space we can break here
      goto done; // this is bad coding practice, i am just a bit lazy now
    }
    buffer[ i ] = ch;
  }

  // keep our old buffer pointer to not create a memleak
  char *old_buffer = buffer;
  buffer = (char *)malloc( bufferSize += 10 );

  // copy content of old buffer to new one
  int k = 0;
  for( k = 0; k <= i; k++ ) {
    buffer[ k ] = old_buffer[ k ];
  }

  // free RAM, else we have a memleak
  free( old_buffer );
  goto repeat_input;

done:
  fputs( buffer, stderr );
  free( buffer );
  return 1;
}
#包括
#包括
int main(){
unsigned bufferSize=0;//我们的数组大小
int i=0;//缓冲区中的当前位置
//我们为缓冲区分配内存
char*buffer=(char*)malloc(bufferSize+=10);
int ch=EOF;//设置为EOF,我们将使用它来缓冲输入
//读取输入,直到缓冲区已满
重复输入:
对于(;i对于(k=0;k使用malloc和realloc为您的输入留出空间。选择一个合理的起始大小(您必须知道预期的字符数)。每次使用realloc时,将大小加倍。

使用malloc和realloc为您的输入留出空间。选择一个合理的起始大小(你必须知道需要多少个字符)。每次你realloc时,都要将大小加倍。

C++流更智能(或更愚蠢,取决于你的尝试)。在C中,你需要使用GET(或fgets)或getc(或fgetc)你能为我们提供什么样的代码?你能为我们提供代码吗?你可以从标准C中考虑<代码> >代码>和<代码> RealCube()>代码>,或者从POSIX,或<代码> STATE()> <代码> >和<代码> MMAP()>代码> > POSIX。或者使用<代码> GETC.()
和亲属,以及
malloc()
等。换言之,有很多方法可以做到这一点。我可能不够清楚。我正在将原始文本存储到字符数组中。但我不知道在达到分米之前我将读取多少个字符。我相信我必须使用标准C。我有点困惑如何使用malloc()考虑到这一点,我还没有什么东西来确定的大小。我想我无法编写自己的动态数组行为,但我认为这超出了我应该做的范围。是的,你需要使用
malloc
malloc
需要你想要分配的RAM大小,它返回
void*
。您可以将其强制转换为所需的任何数据类型:
char*my_array=(char*)malloc(10);
该示例分配10个字节(char)在堆上,你可以分配一个固定的RAM,读取直到它被填满,然后分配一个更大的数组。然后将你的旧数组复制到新的数组中,释放旧的缓冲区。你可以重复这个直到你有你需要的大小。你需要一个更清楚的例子吗?C++流有点聪明(或者愚蠢,取决于你所尝试的)。在C中,您需要使用GET(或FGET)或GETC(或FGEC)。您到底在为什么问题提供代码?请考虑从标准C、或<代码> > GETLILE()> <代码> >或<代码> GETDELIME()>代码> > POSIX,或<代码> STATE()> /Code >和<代码> MAMP()。
来自POSIX。或者使用
getc()
和相关项,以及
malloc()
等。换言之,有很多方法可以做到这一点。我可能不够清楚。我正在将原始文本存储到字符数组中。但我不知道在达到分米之前我将读取多少字符。我相信我必须使用标准C。我有点困惑如何使用malloc()考虑到这一点,我还没有什么东西来确定的大小。我想我无法编写自己的动态数组行为,但我认为这超出了我应该做的范围