【问题标题】:Match arguments to first argument将参数与第一个参数匹配
【发布时间】:2010-10-19 12:19:19
【问题描述】:

好的,我必须编写一个接受 2 个或更多参数的程序,并在第二个和剩余的参数中搜索匹配的参数。
例如输出将是:

./a 3 h 4 9 3  
3 found  

./a hsi and iash me 34 hsi  
hsi found  

到目前为止,我有这个,而且我很确定我这里有很多在这种情况下没用的垃圾。提供的任何帮助将不胜感激!:

int linear_search (const char*A[], char*x, int v ){  
    int i;  
    i = 0;  
    while ( i < v - 1){  
        if  (A[i] == x){  
            return 1;  
        }  
        return 0;  
    }  
}  

int main (int argc, char*argv[]){  
    int size = argc - 1;  
    char*A[size];  
    char*x = argv [1];  
    int i;  
    int v = argc - 2;  

    i = 0;  
    while ( i < v ){  
        A[i] = argv [i + 1];  
        i = i +1;  
    }  

    if (linear_search (A, v, x)){  
        printf ("%s found\n", x);  
    } else {  
        printf ("%s not found\n", x);  
    }  
}  

每当我通过编译器运行程序时,我都会收到警告:从不兼容的指针类型传递 'linear_search' 的 arg 1。
警告:传递 'linear_search' 的 arg 2 会使指针从整数而不进行强制转换。

这是什么意思?

【问题讨论】:

  • 有人可以编辑它以使其更具可读性吗?我的代表太低了,不能自己做:(

标签: string pointers arguments iteration


【解决方案1】:

这就是我的做法。您不需要单独的线性搜索功能。

#include <stdio.h>
#include <string.h>
int main (int argCount, char *argVar[]) {
    int i;
    if (argCount < 3) {
        fprintf (stderr, "Usage: argfind <argToFind> <otherArg> ...\n");
        return 1;
    }
    for (i = 2; i < argCount; i++) {
        if (strcmp (argVar[1], argVar[i]) == 0) {
            printf ("'%s' found in argument %d\n", argVar[1], i);
            return 0;
        }
    }
    printf ("'%s' not found\n", argVar[1]);
    return 0;
}

【讨论】:

  • 我们没有被教导或正在使用很多你用过的东西......不过谢谢!
  • 如果你的问题是作业,你应该用作业标签标记你的问题。否则你会得到答案而不是指导。但是上面的代码显示了您的问题:您需要将字符串与 strcmp 进行比较,而不是 ==。 == 只是比较指针,而不是它们指向的内容。
【解决方案2】:

我认为问题出在线性搜索函数中...看起来您只是在比较指针以查看它们的字符串是否相同。

if (A[i] == x) 

C 不能那样工作。所做的只是检查指针地址是否相同。您需要使用 strcmp() 函数来检查实际字符串是否相同。

我还建议对变量进行更描述性的命名,这样会更容易阅读。 :)

【讨论】:

  • @Kaity: "if (strcmp (A[i],x) == 0) {...}" - 我上面的代码中显示了一个示例(现在,它可能在下面将来 :-)。 strcmp() 是一个函数,它接受两个 char* 并分别返回 0 表示等于或 -1、+1 表示 arg1arg2。在你的情况下,你只需要担心 0。
【解决方案3】:
  • linear_search 的调用与声明不匹配。如果不是彻底的错误,这至少应该给你警告。

    声明是:

    linear_search (const char*A[], char*x, int v )

    而调用是:

    linear_search (A, v, x)

    最后两个参数确实应该交换。

  • 您也不能使用== 运算符来匹配C 中的字符串。您必须使用strcmpstrncmpmemcmp 之一。`

  • 如果您打算使用索引 2 而不是第一个索引中的 A,您可能需要开始复制(argv[ 1 ] 是您要搜索的键,将其放入 A将始终返回匹配项,即使它在参数列表的其余部分中不存在)。

  • 注意在C语言中,可以使用下标操作符将数组的一部分传递给函数,所以不需要复制到数组A。您可以将&amp;argv[ 2 ] 作为linear_search 的第一个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2021-07-24
    • 2011-02-10
    相关资源
    最近更新 更多