在C语言中,从文件中读取动态分配的未知长度的字符串(必须保护从文件中读取数字)。

问题描述 投票:0回答:1

我的问题是,我需要从文件中读取字符串。文件的例子。

例子1

例句号xd 595 xd 49 lol

但我只需要读取字符串部分,而不是数字。我想我必须使用 fscanf()%s 但让我知道你们对它的看法.我的问题开始的部分是如何读取字符串(它是未知长度),使用 malloc(), realloc()? 我自己试了一下,但是失败了(我的解决方案在我的帖子底部).然后我需要在屏幕上显示结果。

P.S. 我必须使用 malloc()/calloc(), realloc() <--它必须是动态分配的字符串:) (char *)

代码我已经试过了。

    int wordSize = 2;
    char *word = (char *)malloc(wordSize*sizeof(char));
    char ch;

    FILE* InputWords = NULL;
    InputWords = fopen(ListOfWords,"r"); /* variable ListOfWords contains name of the file */

    if (InputWords == NULL)
    {
      printf("Error while opening the file.\n");
      return 0;
    }

    int index = 0;
    while((ch = fgetc(InputWords)) != -1)
    {
      if(ch == ' ')
      {
        printf("%s\n", word);
        wordSize = 2;
        index = 0;
        free(word);
        char* word = (char *)malloc(wordSize*sizeof(char));
      }
      else
      {
        wordSize++;
        word = (char *)realloc(word, wordSize*sizeof(char));
        strcpy(word,ch);
        index++;
      }
    }
  fclose(InputWords);

c string file pointers dynamic-memory-allocation
1个回答
0
投票

对于你的代码,你有一些东西需要改进。

  1. fgetc 返回 int 无型 char. 那就换吧 char chint ch;
  2. 作为@pmg的注释,使用EOF(可以是任何负值)而不是-1`。
  3. strcpy(word,ch); 你试图复制字符(ch)到字符指针(word).
  4. 不要投 mallocrealloc 函数。我是否要投掷malloc的结果?.

为了解决你的问题,我建议你使用 strtok 函数将字符串用空格分割,然后测试每个字是否是数字。如果字不是数字,可以使用 strcat 以将该词连缀到旧句中。

完整的代码。

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

int is_number(char *str) {
    if (strlen(str) == 0)
       return -1;
    for(int i =0; (i < strlen(str)) && (str[i] != '\n') ; i++) {
        if(!isdigit(str[i]))
            return -1;
    }
    return 1;
}

int main()
{
    FILE *fp = fopen("input.txt", "r");
    char line[256];

    if(!fp) return -1;
    char **sentence;
    int i = 0;
    sentence = malloc(sizeof(char *));
    if(!sentence) return -1;
    while(fgets(line, 256, fp)) {
        char * token = strtok(line, " ");
        size_t len = 0;
        sentence = realloc(sentence, sizeof(char *) * (i+1));
        if(!sentence) return -1;
        while(token != NULL) {
            if (is_number(token) != 1) {

                sentence[i] = realloc(sentence[i], len + 2 + strlen(token)); // +2 because 1 for null character and 1 for space character
                if (!sentence[i]) {
                    printf("cannot realloc\n");
                    return -1;
                }
                strcat(strcat(sentence[i], " "), token);
                len = strlen(sentence[i]);
            }
            token = strtok(NULL, " ");
        }
        if(len > 0)
           i++;
    }

    for(int j = 0; j < i; j++) {
        printf("line[%d]: %s", j, sentence[j]);
    }

    for(int j = 0; j < i; j++) {
        free(sentence[j]);
    }
    free(sentence);
    fclose(fp);
    return 0;
}

输入和输出。

$cat input.txt
Example 1 sentence
Example sentence number xd 595 xd 49 lol

./test

line[0]:  Example sentence                                                                                                                                  
line[1]:  Example sentence number xd xd lol
© www.soinside.com 2019 - 2024. All rights reserved.