字符串数组中有多少个元素?

问题描述 投票:-4回答:1

我想在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]));
c
1个回答
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)

© www.soinside.com 2019 - 2024. All rights reserved.