【问题标题】:C++ Server Program Print While LoopC++ 服务器程序 Print While 循环
【发布时间】:2018-04-30 05:32:20
【问题描述】:

我正在创建一个服务器/客户端套接字程序,并且正在制定一种打印服务器输入的方法。

这是我的代码:

void *admin_handler (void *ptr) {
    char strBuf [100000];
    const char strExit [20] = "Server: terminated.";

    while(1) {
        scanf ("%s", strBuf);
        int i;
        for (i=0; i < nClient; i++){
            if (strBuf == "Exit"){
                write (nFDList [i], strExit, strlen (strExit) + 1);
            }
            else {
                write (nFDList [i], strBuf, strlen (strBuf) + 1);
            }
        }
    };
}

但是,当我执行时,即使我输入“Exit”,它仍然会执行 else 语句。当我键入“Exit”时,如何修改要执行的 if 语句?

【问题讨论】:

  • 尝试 strcmp 而不是 == 比较
  • How to compare strings的可能重复
  • 除了上述建议之外,将 100,000 个字节扔到堆栈(或用于提供自动存储的任何东西)可能会使您危险地接近堆栈溢出。如果您需要这么大的输入,请考虑使用cinstd::stringstd::string 自行调整大小以适应并从动态存储中分配(通常比自动存储大几个数量级)。
  • 那里看不到 C++。
  • @S.M.仅仅因为你不喜欢代码并不意味着它不是 C++。

标签: c++ while-loop boolean-logic


【解决方案1】:

C 中比较字符串的最佳方法是使用strcmp()(如果对未知字符串的安全性感兴趣,则使用strncmp())。

相等运算符== 直接比较操作数,在它们“衰减”到指针之后;指针不会改变,当然是不同的。相比之下,strcmp() 会检查 指向的内存的内容, 这可能是相等的。

顺便说一句,Java 中存在同样的问题:== 检查双方是否是相同的对象,类似于 C 等价物,而 .equals()检查对象内容,类似于strcmp()

相比之下,

C# 为字符串重载了 ==,以便它确实会查看内容,这对于可以重载运算符的语言(C 不是): 测试对象的身份几乎是不需要的,正如我们所见,这是一个常见的错误来源。

【讨论】:

  • 对不起,我有点劫持了你的答案;-)。我只想提供一些背景信息,然后就被带走了。但它是有用的信息,即使它在 SO 上是多余的。
猜你喜欢
  • 2014-04-01
  • 2022-01-14
  • 1970-01-01
  • 2022-01-09
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多