我在一个文件中有用分隔的单词:
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');
}