我想在names
数组中找到多少个名字。我知道sizeof(names)/sizeof(names[0])
给出了正确的答案。但问题是我不能只宣布char *names[];
。因为编译器给我一个这样的错误“存储名称是未知的”。为了避免这个错误,我必须声明像这个char *names[] = {"somename", "somename2"};
。但问题是我无法在减速后立即分配琴弦。我在一些条件后分配字符串,我的问题是在那个条件之后我有多少字符串。
我的例子。
char *names[];
char word[10];
int i = 0;
while (fscanf(word, sizeof(word), fp)>0) {
// Think hello increase every time loop returns.
// such as "hello1", and the 2nd time "hello2"
if(strcmp(word, "hello1") == 0)
names[i] = word;
}
printf("size: %d\n", sizeof(names)/sizeof(names[0]));
创建阵列后,将固定数组大小。它无法改变。
如果fp
可以读取两次,请读取文件一次以获得字数。
size_t word_count = 0;
int word_length_max = 0;
long pos = ftell(fp); // remember file location
int n = 0;
while (fscanf(fp, "%*s%n", &n) != EOF && n > 0) { // Use %n to record character count
word_count++;
if (n > word_length_max) {
word_length_max = n;
}
n = 0;
}
现在代码知道所需的word[]
数组大小和最大长度。
char *words[word_count];
char word[word_length_max + 1u]; // buffer size needed to read in the words
fseek(fp, pos, SEEK_SET); // go back
for (size_t i=0; i<word_count; i++) {
if (fscanf(fp, "%s", word) != 1) {
Handle_UnexpectedError(); // 2nd pass should have same acceptable results
}
words[i] = strdup(word); // allocate a duplicate
}
完成words[]
后,请务必释放分配的内存。
....
for (size_t i=0; i<word_count; i++) {
free(words[i]);
}
更好的代码也会检查ftell(), fseek(), malloc()
的返回值是否有错误并限制fscanf(fp, "%s", word)
。