【问题标题】:Passing 2 input strings to compare传递 2 个输入字符串进行比较
【发布时间】:2015-09-04 18:12:47
【问题描述】:

我正在测试一个小程序,它基本上比较两个输入字符串是否相同(就像 strcmp 一样)。

我想做类似的事情(用户在同一行键入 2 个所需的字符串)。在这种情况下,它应该返回“两个字符串不同”

./a.out foo bar 

我应该这样做以读取用户的输入字符串吗?

 scanf("%s %s", str1, str2);

gets(str1); gets(str2);

这是我目前所拥有的(由于某些原因,它似乎陷入了无限循环)

int mystrcmp(char str1[], char str2[]) {
    int i = 0;
    while (str1[i] == str2[i]) {
        if (str1[i] == '\0' || str2[i] == '\0') break;
        i++;
    }
    if (str1[i] == '\0' && str2[i] == '\0')
        return 0;
    else
        return -1;
}

int main(int argc, char * * argv) {
    int cmp;
    char str1[1000], str2[1000];
    scanf("%s %s", str1, str2);
    //gets(str1); gets(str2);
    cmp = mystrcmp(str1, str2);
    if (cmp == 0)
        printf("The two strings are identical.\n");
    else
        printf("The two strings are different.\n");
    return 0;
}

【问题讨论】:

  • 命令行中传入的字符串在argv中传入。
  • 为了记录,您通常应该使用fgets 而不是gets 来防止缓冲区溢出。如果我写了两个在最后一个字母上不同的 1001 个字符的单词怎么办?您的程序将无法处理。 fgets 允许您将要读取的字符数设置为安全的(应该比缓冲区的总大小小 1)。

标签: c


【解决方案1】:

你不应该这样做。相反,我建议您了解如何通过argcargv 参数将命令行参数传递给main 函数。

我建议你试试这个程序来帮助你理解:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("argc = %d\n", argc);

    for (int a = 0; a < argc; ++a)
        printf("argv[%d] = \"%s\"\n", a, argv[a]);
}

对于您的示例调用

./a.out foo bar

上面的程序会打印出来

argc = 3
argv[0] = "./a.out"
argv[1] = "foo"
argv[2] = "bar"

【讨论】:

  • 我明白了。那么我是否通过argv[1] 传递第一个输入字符串,然后通过argv[2] 传递第二个输入字符串?
  • 是的。并始终检查argc 以获取正确数量的参数。否则你可能会遇到一些段错误。
  • argvchar *s 的数组。每个元素都指向一个字符串。
  • @Walle 是的,数组中的这两个条目包含指向前两个参数的指针。但是,请始终检查您的数字或参数是否正确(在您的情况下,argc 至少应为 3)。
【解决方案2】:

这个解决方案应该有效:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if(argc != 3) {
        puts("Wrong number of arguments");
        return 0;
    }

    if(strcmp(argv[1], argv[2]))
        puts("The two strings are different.");
    else
        puts("The two strings are identical.");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2015-03-21
    相关资源
    最近更新 更多