【问题标题】:Weird output at the end of string in Ubuntu terminalUbuntu终端中字符串末尾的奇怪输出
【发布时间】:2016-02-06 16:49:16
【问题描述】:

我在 Ubuntu 终端中尝试 C++。我在字符串的末尾得到了奇怪的符号。(过去在 Ubuntu 的 Codeblocks 中也发生过这种情况,但在 Codeblocks Windows 中一切正常)。

代码如下:

#include <iostream>
using namespace std;

int main()
{
    char name[20];
    cout << "\nEnter name: ";
    cin.getline(name, 20);
    cout << "\nHello ";
    cout.write(name, 20);
    return 0;
}

输出:

Enter name: Yash

Hello Yash�@��Fy

我检查了其他有同样问题的线程。他们都有分配问题,用户没有在末尾添加'\0'。但在这里我没有做这样的事情。那为什么最后会得到这些字符呢?

【问题讨论】:

  • OT 备注:如果您的老师实际上仍在使用 Turbo C++ 并教您将 char[] 用作字符串,那么如果您想在外面进行编程,您可能应该得到一本好的和最新的书学校。 char[] 的业务不是 C++ 好。
  • @BaummitAugen 我正在努力改进。我已经有了 C++ Primer。

标签: c++ string ubuntu terminal char


【解决方案1】:
cout.write(name, 20);

将(尝试)准确写入 20 个字符,它不会检查 '\0'。您可以在favorite reference 中查看这些内容。

如果你真的想为此使用char[],你应该写

cout << name;

这将检查终止字符。

不过,最好放弃 C 风格的字符串,转而使用 std::string

int main () {
    std::string name;
    std::cout << "\nEnter name: ";
    std::getline(std::cin, name);
    std::cout << "\nHello ";
    std::cout << name;
}

【讨论】:

  • @Yashbhatt 我希望如此,但我们永远无法确定 TurboC++ 比 C++ 本身更早。你应该考虑从这十年转向编译器。
  • 我每次都尝试向学校的同学解释这一点。
  • @Yashbhatt 啊,我明白了。以上所有内容在最古老的 C++ 版本中都是合法的,而且也是非常基本的东西。所以它很有可能在 Turbo C++ 上运行。
  • 在 Turbo C++ 中运行良好。谢谢。
【解决方案2】:

为了更好地理解这一点,您永远不会将 char name 初始化为 0,并且 cout.write() 不会检查 null。一种选择是从一开始就将char name 初始化为0s:

#include <iostream>
using namespace std;

int main()
{
    char name[20] = {0};
    cout << "\nEnter name: ";
    cin.getline(name, 20);
    cout << "\nHello ";
    cout.write(name, 20);
    return 0;
}

@BaummitAugen 的回答是这样做的正确方法。

【讨论】:

  • 你不需要将name初始化为0,getline会在输入结束后写一个'\0'
  • 但就像我说的,cout.write() 忽略了\0s。如果全部归零,这将不是问题。
  • 但它不会忽略\0,它只会打印它们。所以这只是比以前好一点。好吧,至少没有 UB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多