【问题标题】:Comparing two strings, problems with strcmp比较两个字符串,strcmp 的问题
【发布时间】:2013-10-29 01:01:31
【问题描述】:

我正在尝试检查从标准输入读取的行是否以“login:”开头,但 strcmp 似乎不起作用。

char s1[20], s2[20];
fgets(s1, 20, stdin);
strncpy(s2,s1,6);
strcmp(s2, "login:");
if( strcmp(s2, "login:") == 0)
    printf("s2 = \"login:\"\n");
else
    printf("s2 != \"login:\"\n");

我不在乎“登录:”之后会发生什么,我只是想确保命令是这样给出的。我做错了什么?

【问题讨论】:

  • strcmp 用于精确匹配。我建议仔细阅读C string library,看看是否有其他功能可以用于此任务...
  • 我将前 6 个字符(应该是“login:”)复制到另一个字符串中,该字符串将与字符串“login:”进行比较,所以我要进行完全匹配。
  • 哦,这是一个公平的观点;我没有注意到。

标签: c strcmp strcpy


【解决方案1】:

c 中的字符串库<string.h> 包含两个函数strcmp(s1,s2)strcmpi(s1,s2)strcmp 函数不能按长度比较字符串。 它比较字符串第一个字符的ascii值,如果我提供s1="Login"s2="Sign out",那么它返回负值,因为'L'的ascii小于'S'的ascii。 如果第一个字符与检查第二个字符相同。

【讨论】:

    【解决方案2】:

    strcmp 如果两个字符串完全相同,则返回 0 来完成你想做的事情

    使用:

    strstr(s2 , "login:")

    (如果s2中不存在字符串,则返回NULL

    strncmp(s2 , "login:" , 6)

    这将比较前 6 个字符(如果 s2 以 "login:" 开头,它将返回 0)

    【讨论】:

      【解决方案3】:
      char s1[20], s2[20];
      fgets(s1, 20, stdin);
      strncpy(s2,s1,6);
      strcmp(s2, "login:");
      if( strcmp(s2, "login:") == 0)
          printf("s2 = \"login:\"\n");
      else
          printf("s2 != \"login:\"\n");
      

      您将您的字符串与包含以下字符的“登录”进行比较:'l''o''g''i''n'':''\0' 因此,如果字符串应该相等,则必须s2 中的“\0”。以下代码应该可以工作:

      char s1[20], s2[20];
      fgets(s1, 20, stdin);
      strncpy(s2,s1,6);
      s2[6]='\0'; //end of String
      strcmp(s2, "login:");
      if( strcmp(s2, "login:") == 0)
          printf("s2 = \"login:\"\n");
      else
          printf("s2 != \"login:\"\n")
      

      【讨论】:

        【解决方案4】:

        C 中的每个字符串后面都是一个空终止符,这表明

        当字符串结束时。

        现在,您将 6 个字母从 s1 复制到 s2,即

        login:
        

        这意味着您没有复制空终止符。

        所以 s2 并不完全是你想要的“登录:”。

        所以我建议宁可使用

        strstr(s2, "login:")
        

        检查 login: 是否包含在 s2 中。

        【讨论】:

          猜你喜欢
          • 2013-10-11
          • 1970-01-01
          • 2013-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多