在C中,我们做了类似的事情:
int main(int argc, char **argv) {
printf("The first argument is %s", argv[1]);
printf("The second argument is %s", argv[2]);
return 0;
}
我想知道在使用scanf或fgets时是否可以以类似的方式将字符串存储在数组中。
我试过了:
char **input;
scanf("%s", &input);
无论如何我可以访问作为输入[0]输入的字符串,输入[1] ..等等......
答案 0 :(得分:3)
是的,但您需要确保有足够的空间来执行此操作:
char input[3][50]; // enough space for 3 strings with
// a length of 50 (including \0)
fgets(&input[0], 50, stdin);
printf("Inputted string: %s\n", input[0]);
使用char **input
没有为输入分配任何空间,因此您无法执行此操作。
答案 1 :(得分:3)
这是可能的,但有点乏味,特别是如果你不知道开头的字符串数量。
char **input;
那很好。从那里,你需要分配一个(正确数量的)指针数组:
input = malloc(sizeof(char *) * MAX_LINES);
然后你需要为每一行分配空间。由于您通常只需要为每个字符串提供足够的空间,因此通常会执行以下操作:
#define MAX_LINE_LEN 8192
static char buffer[MAX_LINE_LEN];
long current_line = 0;
while (fgets(buffer, sizeof(buffer), infile) && current_line < MAX_LINES) {
input[current_line] = malloc(strlen(buffer)+1);
strcpy(buffer[current_line++], buffer);
}
如果您不知道前面的行数,通常会分配一些指针来开始(大致如上所述),但是当您读取每一行时,请检查您是否已超出当前分配,如果你重新分配指针数组以获得更多空间。
如果你想要足够严重,你可以对每一行进行相同的操作。在上面,我只是设置了一个足够大的最大值,你可能不会经常使用大多数典型的文本文件。如果你需要更大,那么扩展它很容易。同时,您选择的任何数字都是任意限制。如果您愿意,可以将一个块读入缓冲区,如果字符串中的最后一个字符不是换行符,请继续阅读相同的字符串(并再次使用realloc根据需要扩展分配) 。这并不是非常困难,但正确覆盖所有角落案件可能/确实变得乏味。
编辑:我应该补充说,有一种相同的方式来获得相同的基本效果。将文件的全部内容读入一个大缓冲区,然后(通常)使用strtok将缓冲区分成行(将“\ n”替换为“\ 0”)以构建指向缓冲区的指针数组。这通常会稍微提高速度(一次大读取而不是很多单行读取)以及分配开销,因为您使用一个大分配而不是许多小分配。每个分配通常都有一个标题,并且四舍五入到像(一些的多个)幂为2的幂。其影响因所涉及的线长而异。如果你有一些长线,它可能没什么关系。如果您有很多短线,它可以保存批次。