将文件中的单词读取到2d字符串数组中



我在一个文件中有用分隔的单词:

Moscow
Berlin
Lisbon
Amsterdam
Paris
Nairobi

我想把这些单词读入2d字符串数组。但当我想抑制级数的任何项时,我都无法得到结果。

#include <stdio.h>
#include <string.h>
#define K 10
int
main()
{
int i,j;
char c;
int count=0;
FILE *fp;
fp = fopen("input1.txt","r");
if (fp == NULL)
printf("file not foundn");
while ((c = fgetc(fp)) != EOF) {
if (c == 'n')
count++;
}
char chz[count][K];
while (!feof(fp)) {
for (i=0;  i<count;  i++) {
for (j=0;  j<K;  j++) {
fscanf(fp,"%c",&chz[i][j]);
if (chz[i][j]=='n') {
break;
}
}
chz[i][j]='';
}
}
printf("%c",chz[0][1]);
return 0;
}

文件中可能还有更多的城市名称。所以我首先计算了文件中的字数。如何解决此问题?谢谢

您需要在fgetc循环之后执行rewind(fp)。否则,您已经处于下一个循环的EOF。

为什么fscanf在第二个循环中而不是fgetc

您不会在每个字符串的末尾添加EOS字符。

您的第二个循环可以简化。请注意,您所依赖的事实是,每一行都以'n'结尾。因此,考虑到这一点,您不需要在第二个循环中检查count。你可以将其添加为交叉检查,但实际上并不是绝对必要的。

以下是代码的重构:

#include <stdio.h>
#include <string.h>
#define K 10
int
main()
{
int i,j;
char c;
int count=0;
FILE *fp;
fp = fopen("input1.txt","r");
if (fp == NULL)
printf("file not foundn");
while ((c = fgetc(fp)) != EOF) {
if (c == 'n')
count++;
}
#if 1
rewind(fp);
#endif
char chz[count][K];
i = 0;
j = 0;
while (1) {
int chr = fgetc(fp);
if (chr == EOF)
break;
// add EOS to "previous" word and start a new word
if (chr == 'n') {
chz[i][j] = 0;
++i;
j = 0;
continue;
}
// append char to word
chz[i][j++] = chr;
}
#if 0
printf("%c",chz[0][1]);
#else
for (i = 0;  i < count;  ++i)
printf("WORD: '%s'n",chz[i]);
#endif
return 0;
}

您假设单词长度永远不会超过K(即K是固定的(。

但是,由于您在文件中循环计算count,因此您可以很容易地同时计算K的最大值:

#include <stdio.h>
#include <string.h>
int
main()
{
int i,j;
char c;
int count=0;
FILE *fp;
int len;
int K = 0;
fp = fopen("input1.txt","r");
if (fp == NULL)
printf("file not foundn");
len = 0;
while ((c = fgetc(fp)) != EOF) {
if (c == 'n') {
if (len > K)
K = len;
count++;
len = 0;
}
else
len++;
}
#if 1
rewind(fp);
#endif
char chz[count][K + 1];
i = 0;
j = 0;
while (1) {
int chr = fgetc(fp);
if (chr == EOF)
break;
// add EOS to "previous" word and start a new word
if (chr == 'n') {
chz[i][j] = 0;
++i;
j = 0;
continue;
}
// append char to word
chz[i][j++] = chr;
}
#if 0
printf("%c",chz[0][1]);
#else
for (i = 0;  i < count;  ++i)
printf("WORD: '%s'n",chz[i]);
#endif
return 0;
}

更新:

但我还有最后一个问题。当我试图将这个表达式打印为chz [i][j]时,有些单词最终会出现像^ +%这样的无意义符号。我该如何防止这种情况发生?

您没有为此发布代码,但我怀疑您使用了两个嵌套循环,例如:

for (int i = 0;  i < count;  ++i) {
for (int j = 0; j < K;  ++j)
printf("%c",chz[i][j]);
printf("n");
}

并非所有字符串的长度都相同(即最大长度(。可能的原因是,对于比K短的字符串,您正在输出额外的[垃圾]字符。

您需要在每个单独字符串的长度处停止。下面是一组经过调整的循环:

for (int i = 0;  i < count;  ++i) {
int j = 0;
while (1) {
int chr = chz[i][j++];
// stop at end of word
if (chr == 0)
break;
putchar(chr);
}
putchar('n');
}

最新更新