在 C 中的另一个函数中遍历数组

Iterate Over Array in Another Function in C

我在 main 函数中读取文件时填充了一个未知大小的数组。我想编写另一个遍历此数组的函数,比较字符串和请求字符串的 return 索引。

但是,我似乎无法遍历所有数组并只获取第一个元素。

当尝试打印在数组中找到的元素(来自 findIndex)时,出现以下错误:format specifies type 'char *' but the argument has type 'char' 并且我需要在 [=] 中更改为 %c 14=],据我所知,这是因为我正在遍历数组中的第一项,而不是整个数组。

这是因为我在主函数中创建了一个数组作为char *items[MAXKEY]吗?如何解决问题和 return 函数请求字符串的索引?

int findIndex(int index, char *array, char *item) {

    for (int i = 0; i < index; i++) {

        if (strcmp(&array[i], item) == 0) {

            printf("%s\n", array[i]);  // rising an error format specifies type 'char *' but the argument has type 'char'
           // return i;                // does not return anything 
        }
    }
    return 0;
}

int main () {
    
    FILE *file; 

    char *items[MAXKEY];
    char token[MAXKEY];
    
    int index = 0;

    // adding elements to the array 
    while (fscanf(file, "%s", &token[0]) != EOF) {
        items[index] = malloc(strlen(token) + 1);
        strcpy(items[index], token);
        index++; 
    }
    return 0; 
}

您函数的参数 array 类型不正确。

本次调用printf

printf("%s\n", array[i]);

参数 array[i] 的类型为 char。因此,您不能将转换说明符 schar.

类型的对象一起使用

另外 0 是一个有效的索引。所以这个return声明

return 0;

会使函数的调用者感到困惑,因为它可能意味着找到了字符串,同时也意味着找不到字符串。

函数可以通过以下方式声明和定义

int findIndex( char **array, int n, const char *item ) 
{
    int i = 0;

    while ( i < n && strcmp( array[i], item ) != 0 ) i++;

    return i;
}

尽管对于数组的索引和大小,使用无符号整数类型 size_t 而不是 int.

类型要好得多

在 main 函数中可以这样调用

int pos = findIndex( items, index, some_string );

其中 some_string 是应该在数组中搜索的字符串。

如果在数组中找不到字符串,则 pos 将等于数组的当前实际大小,即 index

因此您可以在调用后在 main 中编写示例

if ( pos == index )
{
   puts( "The string is not present in the array." );
}

您的代码中存在一些问题:

  • main() 中,您定义了一个 char 大小为 MAXKEY 的数组,最多 MAXKEY-1 个字符,但您还定义了一个 char 的数组] 具有相同大小的指针。字符串的个数是否与字符串的最大长度相同?
  • find_index() 的原型与您的目标不一致:您应该将字符串数组声明为 char **arraychar *array[].
  • 返回 0 失败也是一个问题,因为如果在索引 0 处找到字符串,这将是相同的值。失败返回-1似乎更合理。
  • file没有打开,也没有关闭。
  • 你应该使用 strdup() 而不是手动分配内存和复制字符串,尽管你正确地为空终止符分配了一个额外的字节。

这是修改后的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int findIndex(char *array[], int count, const char *item) {
    for (int i = 0; i < count; i++) {
        if (strcmp(array[i], item) == 0) {
            return i;
        }
    }
    return -1;
}

#define MAXKEY 1000  // maximum number of keys

int main() {
    FILE *file; 
    char *items[MAXKEY];
    char token[100];
    int count;

    file = fopen("keys.txt", "r");
    if (file == NULL) {
        printf("cannot open keys.txt\n");
        return 1;
    }
    // adding elements to the array 
    for (count = 0; count < MAXKEY && fscanf(file, "%99s", token) == 1; count++) {
        items[count] = strdup(token);
        if (items[count] == NULL)
            break;
    }
    fclose(file);
    printf("Enter key: ");
    if (scanf("%99s", token) == 1) {
        int index = find_index(items, count, token);
        if (index < 0) {
            printf("Key %s not found\n", token);
        } else {
            printf("Key %s found at index %d\n", token, index);
        }
    }
    while (count --> 0) {
        free(items[count]);
    }
    return 0; 
}