在命令行参数中查找字符串?

时间:2018-01-23 00:14:11

标签: c

我目前正在研究C中的一个程序,它可以接受命令行参数并以各种方式操作它们。在这个特定的片段中,我想通读每个传递的参数并检查单词“Candy”是否以任何可能的方式出现。到目前为止,这就是我所拥有的......

// To test if "Candy" appears in the argument
if (strcmp(argv[i], "Candy", 5) == 0)
{
    printf("Candy!\n", argv[i+1]);
}

我的问题是我正确使用strcmp声明吗?我在这里已经找到了这个问题,但我似乎无法在C中找到任何具体的例子。任何帮助深表感谢!

3 个答案:

答案 0 :(得分:1)

你肯定是在正确的轨道上!

但请注意:strcmp函数的原型是

int strcmp(const char *str1, const char *str2)

- >它只需要两个参数,而不是三个!

如果你想测试参数是否" Candy",正确的方法是:

// To test if "Candy" appears in the argument
if (strcmp(argv[i], "Candy") == 0)
{
    printf("Candy!\n");
    // printf("Candy!\n", argv[i+1]); <- why the argv[i+1] in the original question?? too many arguments for printf...
}

顺便问一下,你使用的编译器是什么?从它的外观来看,你应该得到各种各样的错误和警告!

或者,如果你想查找一个参数是否包含单词Candy,如SugarCandy或SmellyCandyIsBad,你应该strstr()而不是strcmp()。引用,

  

描述

     

C库函数char *strstr(const char *haystack, const char *needle)函数查找字符串haystack中第一次出现的子串针。终止&#39; \ 0&#39;字符不进行比较。

     

声明

     

以下是strstr()函数的声明。

     

char *strstr(const char *haystack, const char *needle)

这意味着要测试字母是否&#34; Candy&#34;出现在参数字符串中,必须执行以下操作:

// To test if "Candy" appears in the argument in any form
if (strstr(argv[i], "Candy")) // strstr != 0
{
    printf("Candy!\n");
}

答案 1 :(得分:0)

  

我的问题是我正确使用strcmp语句吗?

不,你的不是,strcmp只有两个论点。 strncmp 1 但是需要第三个参数,即要比较的最大长度。

if ( strncmp( argv[i], "Candy", 5)==0)
    ...

会是正确的。

你的printf也是错误的。

您正在传递参数,但您的格式没有%s转换说明符,因此参数argv[i+1]将被忽略而不会打印。

但要小心argv[i+1]。如果i等于argc-1,则表示它是最后一个参数,argv[i+1]NULL并且正在执行此操作

printf("something %s\n", NULL);

是未定义的行为。

<强>脚注

1 从手册页引用:

  

man strcmp

#include <string.h>

int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
     

<强>描述

     

strcmp()函数会比较两个字符串s1s2。   如果s1,则返回小于,等于或大于零的整数   分别发现小于,匹配或大于s2

     

strncmp()功能类似,除了它仅比较ns1的第一个(最多)s2字节。< / p>

答案 2 :(得分:0)

感谢大家的反馈意见。经过进一步评估,我意识到使用“strstr”会更好。

到目前为止,这是我的整个代码......

    int main(int argc, char **argv)
{
    char *str = argv[1];
    int j;
    int i = 0;
    int len = strlen(str);

    if(argc>=2) // If the more than just filenam is argumented, will continue.
    {   
        for (i=0;i<argc;i++) // Loops through each argument.
        {
            for(i=0,j=len-1;i<j;i++,j--) //Loop for swapping characters.
            {
                char c = str[i];
                str[i] = str[j];
                str[j] =c;

                if(strstr(str, "candy") !=NULL)
                    {
                    printf("%scandy!\n", argv[i+1]);
                    }
                else
                    {
                    printf("%s\n", argv[i+1]);
                    }

            }
        }


    }
    else //(argc < 2) // If not enough arguments passed in the command line I will die!!!
        {
        exit(1);
        }

    return 0;
}

再次感谢所有发布的人。我认为我非常接近完全工作:D。截至目前,当我运行它时,它给了我倒退的第一个字。截至目前,它向后打印这个词,但它的命中或未命中并且可以使它无序。关于如何解决这个问题的任何想法?我知道我有argv [i + 1],但我只是不想打印初始文件名或./a.out。