我目前正在研究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中找到任何具体的例子。任何帮助深表感谢!
答案 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()
函数会比较两个字符串s1
和s2
。 如果s1
,则返回小于,等于或大于零的整数 分别发现小于,匹配或大于s2
。
strncmp()
功能类似,除了它仅比较n
和s1
的第一个(最多)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。