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

时间:2017-12-24 14:45:40

标签: c

我想在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]));

1 个答案:

答案 0 :(得分: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)