[英]Searching for a key using va_arg in C
作為參數的第一個數字是要在它后面的數字中找到的鍵。 我的代碼忽略了第一個數字並將第二個數字存儲在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()
function 在多個 arguments 上循環,因此一次運行可以測試多個值。
我還更改了調用,以便將變量列表中的 arguments 的數量作為n
給出,即第一個參數。 總是返回0
是沒有意義的,所以我將 function 更改為返回void
(無)。 或者,您應該返回flg
以便調用代碼可以判斷是否找到了該值。 function 不返回任何值,這將產生代碼:
#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!
$
這是我所期望的。
這是一個重組版本,它報告了找到密鑰的 position。 搜索 function 中沒有打印 — 將 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;
}
樣品 output:
$ 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
$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.