【问题标题】:String Comparison Logic Error字符串比较逻辑错误
【发布时间】:2015-07-08 18:52:57
【问题描述】:

这个程序是比较字符串,但我不明白为什么它每次都返回相同的 c 值。谁能帮我理解这个? 谢谢。

 int func(char *n,char *m)
      {
           int c;
           c = (int)malloc(sizeof(int));
           c=0;
           while(*n == *m)
               {
                    if(*n=='\0' && *m=='\0')
                        {
                            int c=1;
                            break;
                        }
                    else
                        {
                           n++;
                           m++;
                        }
                  }
        printf("%d \n",c);
        return(c);
      }

【问题讨论】:

  • 这还能编译吗?除其他外,您已经在同一范围内多次定义了int c。另外,你为什么要返回 malloc()?在 C 中,这是一个错误。
  • 我最好不要给我标准警告(“不要投void *)。你​​有更糟糕的问题要先解决。一个好的开始是最近的C书。
  • c = (int)........请叫救护车...
  • @SouravGhosh:我刚刚注意到那个。如果有人再次询问为什么不投void *,这是一个很好的例子。没有什么是无用的;它总是可以用来吓唬某人。
  • 是的,不知道如何多次使用 int 逃脱了我。但我在某处读到变量范围在函数之外被破坏,所以使用了 Malloc。但是一秒钟都没有想到 return 只是返回一个值。我的坏人。谢谢大家

标签: c string malloc


【解决方案1】:

我相信函数返回
1 表示匹配
0 表示不匹配
c 的值设置为 1,表示字符串相等,并在 m 或 n 之一为空时返回。 (如果相等,两者都将为空)
如果字符串不相等,则 c 以初始化形式返回 -> 0。

下面的版本可以做到这一点。

将此版本与您的原始版本进行比较以获得建议的更改:

1) 您不需要为 int c; 分配内存,它被隐式创建为 auto。
2)可以在同一行初始化:int c = 0;
3) 不要在if(...){...}block
中重新创建int c 4) 如果*m 或*n 为NULL,您想退出。
5) 因为while 保证*m 和*n 相同,所以不需要检查两者是否为NULL。 (感谢@mch 评论)

int func(char *n,char *m)
{
    int c=0;//1,2,
    while(*n == *m)
    {
        if(*n=='\0') //5, 4
        {
            c = 1;//3
            break;
        }
        else
        {
           n++;
           m++;
        }
    }
    printf("%d \n",c);
    return(c);
}

【讨论】:

  • 你可以删除|| (*m=='\0'),因为*m必须等于*n,因为while。
  • @ryyker 感谢您的详细解释。刚开始使用 C 语言所以犯了很多错误。
【解决方案2】:

此函数将始终返回 0。

您在顶部定义c 并将其设置为0(malloc 返回的值被覆盖)。稍后,您在内部范围内定义了一个名为 c 的新变量,隐藏了先前的声明。所以外层的c设置为0后就永远不会被修改了。

将int c=1; 更改为c=1,这可能就是您要查找的内容。另外,这里不需要调用malloc,因为它会分配动态内存,而c 本身就是int,而不是指向它的指针。

【讨论】:

  • 嘿,谢谢。C 语言中的新手,到处都是愚蠢的错误。
猜你喜欢
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
相关资源
最近更新 更多