[英]Dynamic array strings in c
我有一个任务,我应该逐行读取一个文本文件,然后我应该反转行(该行包含一个字符串),同时我必须反转行的顺序,所以最后一个应该是第一个应该是第二个,依此类推,我必须将所有这些都写在标准 output 上。
首先,我应该从 argv[] f 中读取一个枚举,它可以是“linenums”或“nolinenums”,如果它是“nolinenums”我无事可做,但对于“linenums”我必须向后编号。 然后一个 int 和另一个 arguments 应该是文件的名称。
一个例子:./main linenums 5 example.txt
输入:
output:
该任务说我必须使用动态数组来存储行,我无法在读取行之前计算文件的行数,如果行数大于动态数组的大小,我应该将其大小加倍。
好吧,我做了一些事情,但有点乱,我知道这个网站不是为了完全完成我的任务,但我会非常感激,但任何帮助都会很好。 (我的时间也很有限)
这是我到目前为止所做的:
#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,我的 output 与示例是正确的,但是当我必须处理多个文件时我仍然遇到问题,并且当行数多于已分配的行数时我仍然必须执行重新分配(我应该加倍)。
根本问题在这里
words[lines] = buffer;
这不会复制字符串,而是替换单词数组中的指针(指向您刚刚在上面分配的 memory)
你需要
strcpy(words[lines], buffer);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.