strncmp不应该工作

时间:2014-03-26 10:30:15

标签: c string comparison string-comparison strcmp

我在使用strncmp时遇到问题。在我读到的时候,如果两个字符串的字符相等,理论上strncmp应该返回0;但是,当我进行比较时,代码行为异常并产生误报(不等于字符,仍然是if子句)。代码如下:

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

int main(){
    char *frase1="some string";
    char *frase2="another string";
    char *frase3="some other string";

//Comparar frases desde inicio
    if(strncmp(frase1, frase2, 200))printf("1<->2, 200 characters\n");
    if(strncmp(frase1, frase3, 20))printf("1<->3, 20 characters\n");
    if(strncmp(frase1, frase3, 4))printf("1<->3, 4 characteres\n");

    return 0;
}

如果字符串相等(至少是比较的字符),它们应该打印消息;如果没有,什么都不做;所以我仍然不明白为什么第一个条件成为现实。

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

strcmp&amp;如果字符串相等,strncmp函数将返回0。你应该这样做:

if (strncmp(frase1, frase3, 4) == 0) ...

即:

char *str1 = "Example 1";
char *str2 = "Example 2";
char *str3 = "Some string";
char *str4 = "Example 1";

if (strncmp(str1, str2, 7) == 0) printf("YES\n");  // "Example" <-> "Example"
else printf("NO\n");

if (strncmp(str1, str3, 2) == 0) printf("YES\n");  // "Ex" <-> "So"
else printf("NO\n");

if (strcmp(str1, str4) == 0) printf("YES\n");      // "Example 1" <-> "Example 2"
else printf("NO\n");

产生YESNOYES

答案 1 :(得分:0)

  

如果字符串相等(至少是比较字符),则应打印消息

不,如果字符串相等,则不应打印消息,因为strncmp在相等时返回0。由于上一次检查返回0,它不会被打印而另外两个非零,即不相等,因此您会看到它们被打印出来。

strncmp的文档可以让您更清晰。它返回

    当lhs == rhs 时,
  • 0
  • &LT;当lhs&lt; 0时RHS
  • &GT;当lhs> 0时为0 RHS

答案 2 :(得分:0)

如果字符串相等,strncmp()函数返回零,否则返回非零值。因此,如果比较两个不相似的字符串,则得到一个非零值,就if语句而言,非零值为TRUE。所以你需要做的是:

   if(!strncmp(frase1, frase2, 200))printf("Mismo insulto no creo\n");

答案 3 :(得分:0)

你应该将strncmp() == 0作为要评估的表达式

工作代码:

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

int main(){
char *frase1="some string";
char *frase2="another string";
char *frase3="some other string";

//Comparar frases desde inicio
if(strncmp(frase1, frase2, 200) == 0)
   printf("1<->2, 200 characters\n");
if(strncmp(frase1, frase3, 20) == 0)
   printf("1<->3, 20 characters\n");
if(strncmp(frase1, frase3, 4) == 0)
   printf("1<->3, 4 characteres\n");

return 0;
}

答案 4 :(得分:0)

一,在发布示例代码时,将字符串和标识符保留为英语是一种良好的做法。可读性胜过乐趣。

如果条件为if,则会执行两个true块。值0被视为false,而其他的值<{1}}被视为0

即,你的问题不是true,而是关于真与假的混淆。