【问题标题】:Safely reading in strings of unknown length安全读取未知长度的字符串
【发布时间】:2013-10-22 02:26:35
【问题描述】:

我正在尝试使用 fgets 安全地获取未知长度的字符串

这是迄今为止我能够提出的代码,但现在我被困在如何继续前进。

#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 
#include <assert.h> 

#define DEFLEN 4 
#define CHUNKSZ 2 


int i = 0;
int size =0;
int size2 =0;
char* ln1;
char* ln2;
FILE *fpin;
char *getStrFromFile( FILE *fpins  )/*file stream to read string from */
 {

 DEFLEN = malloc( CHUNKSZ *sizeof(int));
 while(1){
  if( fgets(ln1+size2, DEFLEN, fpin) == NULL) {
    if(size > 0){
     return (ln1);
    }
    else {
      return (NULL);
      free(ln1);
    }
  }
 else{
   size2=strlen(ln1);
   if(ln1[size2 -1] == '\n'){
     return (ln1);
   }
    else{
     ln2=malloc(size+CHUNKSZ * sizeof(char));
     assert(ln2);
     strcpy(ln2, ln1);
     free (ln1);
     ln1 = ln2;
     return (ln1);
    }
   }
}

我也收到 DEFLEN = malloc 行的错误

错误:需要左值作为赋值的左操作数

【问题讨论】:

  • 你想实现readline吗?
  • 我更担心代码编译,而担心它是否有效。您正在将地址分配给整数常量。而且您的尺寸不一致。您的初始尺寸为CHUNKSZ * sizeof(int),后续尺寸为CHUNKSZ * sizeof(char)。您可能需要修复它以及大量其他错误。最后,none 中的变量应该是全局变量; .

标签: c malloc fgets


【解决方案1】:

预编译器使用代码中的 DEFINE。所以你不能为定义分配任何东西!

这一行

DEFLEN = malloc( CHUNKSZ *sizeof(int));

被替换为

4 = malloc( CHUNKSZ *sizeof(int));

【讨论】:

    【解决方案2】:

    您不能重新分配DEFLEN。它是一个在编译前被替换的占位符,它在被替换值之外的存在在运行时就消失了。

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2021-12-04
      • 2011-05-14
      • 1970-01-01
      • 2014-01-10
      • 2020-05-03
      相关资源
      最近更新 更多