我写的是编写一个函数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时才有效。如果它在其他索引中,则会失败。
答案 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错误而不是行为异常。