查找数组中给定字符串的索引

时间:2015-03-11 10:40:40

标签: c arrays

我写的是编写一个函数findTarget(),它搜索目标名字符串是否已存储在字符串数组中。

其中nameptr是用户输入的字符串数组,size是存储在数组中的名称数 和target是目标字符串。如果找到目标字符串,该函数将返回其索引位置,或-1 如果不是的话。

#include <stdio.h>
#include <string.h>
int findTarget(char *target, char nameptr[][80], int size);
int main()
{
    int num, i;
    char target[100];
    char names[10][100];
    printf("Enter no. of names:");
    scanf("%d", &num);
    printf("Enter %d names: ", num);
    for (i = 0; i < num; i++)
    {
        scanf("%s", names[i]);
    }
    printf("Enter target name: ");
    fflush(stdin);
    gets(target);
    printf("findTarget(): %d", findTarget(target, names, num));

}

int findTarget(char *target, char nameptr[][80], int size)
{
    int i;
    for (i = 0; i < size; i++)
    {
        if (strcmp(target,nameptr[i]) == 0)
        {
            return i;
        }
    }
    return -1;
}

我知道使用gets()不是推荐,但我们将把它放在一边。不知何故,它只有在我找到的目标恰好位于索引0时才有效。如果它在其他索引中,则会失败。

2 个答案:

答案 0 :(得分:0)

问题是该函数是用第二个参数声明的,作为指向char [80]类型数组的第一个元素的指针

int findTarget(char *target, char nameptr[][80], int size);

然而,在main中你传递一个定义的数组,它具有元素的类型char[100]

char names[10][100];

因此该函数具有未定义的行为。

在主要部分重新声明数组

char names[10][80];

请注意您应检查num的输入值是否小于或等于10.

至于我,我会按以下方式声明该功能

size_t findTarget( const char nameptr[][80], size_t size, const char *target ); 

对于函数gets,它现在不是标准函数,因为它不安全。 来自C标准

  

删除了gets function()

您可以使用例如fgets

如果数组已排序,您也可以使用标头bsearch中声明的标准C函数<stdlib.h>

#include <stdlib.h>
void *bsearch(const void *key, const void *base,
size_t nmemb, size_t size,
int (*compar)(const void *, const void *));

答案 1 :(得分:-2)

上述程序的解决方案如下:

printf("Enter target name: ");
    getc(stdin);
gets(target);

除了

之外
  

nameptr [] [80]

全面纠正。

它与获取函数有关。它已被弃用。

gets(target);

在scanf之间执行从STDIN读取并获取使用时,数据读/写管道存在冲突。

如果我们只是替换声明

gets(target)

scanf("%s", target) 

它完全正常

根据strace日志

read(0, try
"try\n", 1024)                  = 4
lseek(0, -1, SEEK_CUR)                  = -1 ESPIPE (Illegal seek)
write(1, "Enter target name: findTarget():"..., 35Enter target name: findTarget(): -1) = 35
exit_group(16)                          = ?
+++ exited with 16 +++

通过scanf读取姓氏后,程序试图通过STDIN再次通过获取命令读取ESPIPE错误而不是行为异常。