c中的动态数组字符串

9jyewag0  于 2023-01-12  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个任务,我应该逐行读取文本文件,然后我应该反转该行(该行包含一个字符串),同时我还必须反转行的顺序,所以最后一行应该是第一行,倒数第二行应该是第二行,依此类推,我必须将所有这些都写在标准输出上。
首先我应该从argv [] f中读取一个枚举,它可以是"linenums"或"nolinenums",如果是"nolinenums"我就什么都不用做,但是对于"linenums"我必须倒着给行编号,然后一个int和其他参数应该是文件的名称。
一个例子:./main linenums 5示例. txt
输入:

  • 苹果
  • 汽车

输出:

  • 3个rewot
  • 2种族
  • 1埃帕

任务要求我必须使用动态数组来存储行,我不能在读取行之前计算文件的行数,如果行数大于动态数组的大小,我应该将其大小加倍。
好吧,我做了一些,但它是一种混乱,我知道这个网站是不是使我的任务完全,但我会很感激,但任何帮助将是很好的.(我有非常有限的时间也)
这是我目前所做的:

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

typedef enum Type{
linenums,
nolinenums
}Type;

struct str{
Type type;
int length;
};

#define BUFFERSIZE 50

int main(int argc, char *argv[])
{
struct str Data;

if(argc < 3)
{
    printf("\trev [SHOW LINE NUMBERS] [MAX LINE LENGTH] files...\n");
    exit(1);
}

if(strcmp(argv[1], "linenums") == 0)
{
    Data.type = linenums;
}
else if(strcmp(argv[1], "nolinenums") == 0)
{
    Data.type = nolinenums;
}
else
{
    printf("Wrong format!");
    exit(1);
}

Data.length = atoi(argv[2]);

for(int i=3; i<argc; i++)
{
    FILE *fpin = fopen(argv[i], "r");
    char buffer[BUFFERSIZE];
    
    int lines = 0;

    if(fpin == NULL)
    {
        fprintf(stderr, "File opening unsuccessful: %s", argv[i]);
        exit(1);
    }
    else
    {   
        char **words = malloc(sizeof(char) * 8);
        for(int i = 0; i < 8; i++)
        {
            words[i] = malloc(sizeof(char*) * 1025);
            if(words[i] == NULL)
            {
                printf("Memory allocation unsuccesful");
                exit(1);
            }
        }

        while(fgets(buffer, BUFFERSIZE, fpin) != NULL)
        {
            buffer[strcspn(buffer, "\n")] = '\0';
            strrev(buffer);
            strcpy(words[lines], buffer);
            lines += 1;
        }
        if(Data.type == 0)
        {
            while(lines>0)
            {
                printf("%d %s\n", lines, words[lines-1]);
                lines -= 1;
            }
        }
        else
        {
            while(lines>0)
            {
                printf("%s\n", words[lines-1]);
                lines -= 1;
            }
        }
        
        printf("\n");
    }
    fclose(fpin);
}

return 0;
}

我的主要问题是动态数组和遍历argv []数组
多亏了pm100,我的输出与示例是正确的,但是当我必须处理多个文件时,我仍然有问题,并且当行数超过已经分配的行数时,我仍然必须执行realloc(我应该将其加倍)。

aydmsdu9

aydmsdu91#

这里的基本问题

words[lines] = buffer;

这并不复制字符串,而是替换words数组中的指针(指向上面刚刚分配的内存)
你需要

strcpy(words[lines], buffer);

相关问题