c - 在 C 中使用 va_arg 搜索键
问题描述
作为参数的第一个数字是要在它后面的数字中找到的键。我的代码忽略了第一个数字并将第二个数字存储在 中key
,当我在参数的开头添加一个零以修复选择第二个参数时,也无法返回正确的结果。
编码:
int search(int n, ...)
{
va_list vl;
va_start(vl,n);
int key,flg=0;
key=va_arg(vl,int);
printf("key %d\n",key);
for(int i=2;i<=n;i++)
{
int x=va_arg(vl,int);
if(key==x)
{
printf("FOUND!\n");
flg=1;
break;
}
}
if(flg==0)
printf("NOT FOUND!\n");
va_end(vl);
return 0;
}
int main(int argc,char *argv[])
{
if(argc<=1)
{
printf("No arguments passed!");
}
else
{
int key=atoi(argv[1]);
search(0,key,34,45,12,78,11,4,90,89,54,63,7,98,43);
}
return 0;
}
解决方案
此代码接近您的代码。我更改了错误处理main()
——错误消息应该报告在stderr
,而不是stdout
,并且应该以换行符结尾。该main()
函数循环多个参数,因此一次运行可以测试多个值。
我还更改了调用,以便将变量列表中的参数数量作为n
第一个参数给出。总是返回没有意义,0
所以我将函数更改为返回void
(无)。或者,您应该返回flg
,以便调用代码可以判断是否找到了该值。函数不返回任何值,这将产生代码:
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
static void search(int n, ...)
{
va_list vl;
va_start(vl, n);
int key, flg = 0;
key = va_arg(vl, int);
printf("key %d\n", key);
for (int i = 0; i < n; i++)
{
int x = va_arg(vl, int);
if (key == x)
{
printf("FOUND!\n");
flg = 1;
break;
}
}
if (flg == 0)
printf("NOT FOUND!\n");
va_end(vl);
}
int main(int argc, char *argv[])
{
if (argc <= 1)
{
fprintf(stderr, "Usage: %s key\n", argv[0]);
exit(EXIT_FAILURE);
}
for (int i = 1; i < argc; i++)
{
int key = atoi(argv[i]);
search(13, key, 34, 45, 12, 78, 11, 4, 90, 89, 54, 63, 7, 98, 43);
}
return 0;
}
运行(源va71.c
,程序va71
)时,我得到:
$ va71 89 78 34 43 199 -1
key 89
FOUND!
key 78
FOUND!
key 34
FOUND!
key 43
FOUND!
key 199
NOT FOUND!
key -1
NOT FOUND!
$
这是我所期望的。
这是一个重新组织的版本,它报告找到密钥的位置。搜索功能中没有打印 — 将 I/O 与搜索分开。
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
static int search(int n, int key, ...)
{
va_list vl;
va_start(vl, key);
int flg = -1;
for (int i = 0; i < n; i++)
{
int x = va_arg(vl, int);
if (key == x)
{
flg = i;
break;
}
}
va_end(vl);
return flg;
}
int main(int argc, char *argv[])
{
if (argc <= 1)
{
fprintf(stderr, "Usage: %s key\n", argv[0]);
exit(EXIT_FAILURE);
}
for (int i = 1; i < argc; i++)
{
int key = atoi(argv[i]);
printf("key %d: ", key);
int rv = search(13, key, 34, 45, 12, 78, 11, 4, 90, 89, 54, 63, 7, 98, 43);
if (rv < 0)
printf("not found\n");
else
printf("found at index %d\n", rv);
}
return 0;
}
样本输出:
$ va71 89 78 34 43 199 -1
key 89: found at index 7
key 78: found at index 3
key 34: found at index 0
key 43: found at index 12
key 199: not found
key -1: not found
$
推荐阅读
- python - 运行假设时如何退出 pdb 调试?
- c# - 当同时撰写多封电子邮件时,Outlook 不会触发 AttachmentAdd 事件,但一封电子邮件除外
- json - 如何在 json 文件中使用变量?
- react-native - React Native webview with login facebook总是在发布模式下重定向到另一个url(仅限android)
- amazon-web-services - 如何从 AWS VPC 中的私有子网连接到 Internet?
- python - 如何在数据框列 pandas 中找到最接近所选数字的 5 个数字的索引?
- facebook-graph-api - DailogFlow 将线程控制传递给 Facebook Messenger
- windows - Magento 2.3.0 file_get_contents() 问题:权限被拒绝
- python - 如何使用python将此HTML文件转换为PDF
- python - 在 Codepipeline 中调用 Lambda,输入工件是来自 Github 的源文件