【问题标题】:How to generate a function to print char [ ] array in C++?如何在 C++ 中生成打印 char [] 数组的函数?
【发布时间】:2016-08-30 08:37:03
【问题描述】:

我正在尝试编写一个小函数来打印中间和末尾包含 0 的字符数组。我的功能无法正确打印,我缺少什么 :-(
预期结果:再见0ld0 实际:再见了

// call function 
char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 };
    displayResult(str5);

// This is function 

     void displayResult(string _st)
    {
        int l = _st.length();
        for (int i = 0; i<=l; i++)
    {
        cout << _st[i];
        //printf("%s\n", _st[i]);
    }
    cout << endl;
    }

【问题讨论】:

  • 0 是一个 eos 标记。使用“0”。
  • 我不想改变我的数组。我想修改我的打印功能。 @约翰尼莫普
  • cout &lt;&lt; ( _st[i] ? _st[i] : '0' );
  • 你想打印一个零还是空格?零字节是 C 风格字符串中的字符串终止符。
  • 1. &lt;= 在您的 for 循环中太远了 2. 为什么要将数组作为 std::string 传递?

标签: c++ arrays function char


【解决方案1】:

将 0 作为字符 '0'。因为'0' 和 0 不一样。当您简单地输入 0 时,您正在指定字符的 ASCII 代码,它是一个空终止符(字符串结尾的标记),您将在那里看不到任何内容。并且不要忘记将空终止符放在末尾。

char str5[] = { 'G','o','o','d','-','b','y','e','0','l','d','0','\0' };

【讨论】:

  • 我不想改变我的数组。我想修改我的打印功能。 @bkVnet
  • @Keihan 在这种情况下,检查'\0'并输出'0'。
  • @bkVnet:您的解决方案可能不起作用,因为 '\0' 是字符串终止符。如何知道字符串中有 0 个、1 个还是多个?嗯....
  • @ThomasMatthews 你是对的,为了使我评论中的解决方案起作用,必须删除字符串终止符。这就是我最初建议使用'0' 而不是0 的原因。在这种情况下,他还需要使用迭代器将字符复制到字符串中。
【解决方案2】:

一种方法是检查给定字符是否为'\0'并将其输出为0:

    if (_st[i] == '\0')
      cout << '0';
    else
      cout << _st[i];

要将整个数组传递给您的函数,您应该使用不同的字符串构造函数,即接受迭代器的构造函数:

displayResult(std::string(std::begin(str5), std::end(str5)));

否则 std::string 将只复制数组内容直到第一个空字符

最后一件事,如果你不想在输出中包含最后一个空字符,那么将循环条件更改为:

for (int i = 0; i<l; i++)
                ^^^

【讨论】:

  • 循环条件也有问题,应该小于不小于等于
  • @Slava thanx,我只是在看这个
【解决方案3】:

你有很多问题。

char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 };
    displayResult(str5);

存在从字符数组到std::string 类型的隐式转换。

std::string 类型的构造函数将从数组中加载 个字符,直到它到达一个终止nul 字符,它位于“bye”之后。因此“ld”永远不会被放入字符串中。

如果您希望将所有字符值放入字符串中,您需要显式调用正确的std::string constructor:

char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 };
std::string s(str5, sizeof(str5));
displayResult(s);

std::string 旨在容纳字符集的所有值,包括终止 nul 和不可打印。

通过使用正确的构造函数,有问题的 '\0' 将出现在字符串中,您可以搜索和替换它(在字符串变量中)。

如果没有计划修改,您可能需要将字符数组声明为const:

const char str5[] = { 'G','o','o','d','-','b','y','e',0,'l','d',0 };

你也可以这样声明:

const char str6[] = {"Good-bye\0ld"};

【讨论】:

    【解决方案4】:

    你可以这样写函数

     void displayResult(string _st)
     {
        int l = _st.length();
        for (int i = 0; i < l; i++)
        {
           cout << ( (_st[i]== 0) ? '0' : _st[i] );
           //printf("%s\n", _st[i]);
        }
    }
    

    【讨论】:

    • 字符数组在哪里? OP 正在使用字符数组。
    • 另外,不要在变量名中使用前导下划线,因为它们可能与内部编译器符号冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多