在 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
。因此,您不能将转换说明符 s
与 char
.
类型的对象一起使用
另外 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 **array
或 char *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;
}
我在 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
。因此,您不能将转换说明符 s
与 char
.
另外 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 **array
或char *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;
}