【问题标题】:Dynamically allocated array with dynamically allocated string elements, using getline()动态分配的数组与动态分配的字符串元素,使用 getline()
【发布时间】:2015-12-07 16:20:11
【问题描述】:

我正在尝试使用getline() 创建一个具有动态分配字符串元素的动态分配数组。

这是我的代码,

char** getWordlist()
{
    FILE* fp = fopen( "Wordlist", "r" );
    if( errno == ENOENT )                   
        fp = fopen( "Wordlist", "w+r" );
    if( !fp ) {
        perror( "Could not open wordlist" );
    exit(EXIT_FAILURE);
}

int c, fileLines = 0;
do{
    c = fgetc(fp);
    if( c == '\n')
        fileLines++;
} while( c != EOF );
rewind(fp);


char** wordlist = calloc( fileLines, sizeof(char*) );  
for( c = 0; c < fileLines; c++ )
    getline( &wordlist[c], 0, fp );

     printf( "%s", (wordlist[0]) );

fclose(fp);
return wordlist;    
} 

但是,printf 打印输出 (null),所以我认为从未创建过字符串。

我做错了什么?

【问题讨论】:

  • 你的int main(...);在哪里?
  • 为什么在printf( "%s", (wordlist[3]) ); 中有3
  • 如果Wordlist 不以'\n' 结尾,则用于确定fileLines 的方法将短1。
  • @Eijomjo 如果文件包含 3 个单词而不是您 wordlist[3] 将访问索引超出范围并导致 未定义行为 。你可以有有效的索引0 ,1 ,2 而不是3。不要访问索引3
  • @Eijomjo 这个信息是必要的,有问题要提到。

标签: c arrays memory-management


【解决方案1】:

getline()的错误用法

传递地址为size_t 而不是0

for( c = 0; c < fileLines; c++ )
  // getline( &wordlist[c], 0, fp );
  size_t size = 0;
  getline( &wordlist[c], &size, fp );

在行数计算中将电位修正为 1

int c;
size_t fileLines = 0;
int previous = '\n';
while ((c = fgetc(fp)) != EOF) {
    if( previous == '\n') fileLines++;
    previous = c;
}

【讨论】:

    【解决方案2】:

    关于这一行:

    printf( "%s", (wordlist[3]) );
    

    它试图打印错误的行。它不是从文件中读取行的for() 循环的一部分。

    建议:

    size_t lineLength = 0;
    for( int i = 0; i < fileLines; i++ )
    {
         getline( &(wordlist[i]), &lineLength, fp );
         printf( "%s\n", wordlist[i] );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-09
      • 2015-07-14
      • 2011-10-21
      • 1970-01-01
      • 2014-04-20
      • 2019-07-19
      相关资源
      最近更新 更多