Первое число, принятое в качестве аргумента, - это ключ, который следует искать в числах, следующих за ним. Мой код игнорирует первое число и сохраняет второе число в 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;
}
c
0
crayon 30 Ноя 2020 в 09:51

1 ответ

Лучший ответ

Этот код близок к вашему коду. Я изменил обработку ошибок в 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!
$

Чего я и ожидал.

Вот реорганизованная версия, в которой указывается позиция, в которой найден ключ. В функции поиска нет печати - держите ввод / вывод отдельно от поиска.

#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
$
1
Jonathan Leffler 30 Ноя 2020 в 07:22