【问题标题】:C++ How do I set an entire character array to blank spaces?C++ 如何将整个字符数组设置为空格?
【发布时间】:2015-04-08 11:51:21
【问题描述】:

假设我有以下声明的变量:

char mychararray[35];

我想将数组中的每个字符都设置为空格... 我该怎么做?

我的教练告诉我我所要做的就是把

mychararray = "";

但这根本不起作用......

我使用的是过时版本的 Visual Studio (2012),还是这只是一个糟糕的初始化?如果是后者,请说明如何使所有字符为空格。

提前致谢!

【问题讨论】:

  • initialize array to 0 in C 的可能重复项
  • 在一行上分配char myarray[35] = ""; 确实有效。所有字符都是'\0'
  • @zenith 不是。它不会“将数组中的每个字符都设置为空格”。
  • @juanchopanza 我知道。我只是指出 OP 的 = "" 不仅仅是一些糟糕的初始化。
  • 请说明什么是“空格”。您希望数组中的每个字符都是空格字符“”(没有终止符“\0”),还是希望它们都为“\0”或其他?

标签: c++


【解决方案1】:

您可以在声明数组时按照讲师建议的方式对其进行初始化:

char mychararray[35] = "";

它将数组设置为空字符串。

如果你以后想把它变成一个空字符串,那么你可以这样做

mychararray[0] = '\0';

如果你想让它成为一个由 34 个空格组成的数组(第 35 个字符为空终止符),那么

memset(mychararray, ' ', 34);
mychararray[34] = '\0';

【讨论】:

  • 好的,所以我猜第一个选项最接近我的导师试图让我做的事情,对吗?
  • @tomkelley13 不,第一个选项不会将整个数组设置为空格。它将第一个元素设置为空终止符。所有其他元素都未初始化。
  • @tomkelley13,它的作用与您最初写的 char mychararray[35] = ""; 我更新了我的答案一样。
  • 我使用了第二个选项,这似乎对我有用...谢谢。
  • @juanchopanza:你确定吗? [dcl.init.string]/3 说If there are fewer initializers than there are array elements, each element not explicitly initialized shall be zero-initialized.
【解决方案2】:

std::memset 是你的朋友。

memset(mychararray, ' ', 34);
mychararray[34]='\0';

如果你想用'\0'的所有元素来初始化数组,你有一个更简洁的方法是通过aggregate initialization

char mychararray[35] = {};

【讨论】:

  • 将内存覆盖 1 个字节。 (mychararray[35] = '\0')
  • @user2225104 已修复。谢谢!
  • 函数std::fill更安全,memset函数只能和bytes一起使用。
  • @ThomasMatthews 同意。这确实是char 数组特定的答案。由于指定的字节是 char 文字,因此不必担心溢出。
【解决方案3】:

C++ 不会将 char 初始化为 ' '(其 ascii 值为 0x20,顺便说一句);实际上,未指定用于初始化的数组初始化不一定会发生(本地范围内的数组未初始化)。

【讨论】:

    【解决方案4】:

    这不是初始化,而是赋值。声明数组时初始化数组,可以这样写:

    char mychararray[35] = "";
    

    如果你已经有一个数组并且想将它设置为零,你可以使用std::fill

    #include <algorithm>
    #include <iterator>
    
    int main() 
    {
        char c[35] = "Hello, world!";
        std::fill(std::begin(c), std::end(c), '\0');
        // c will contain only zeros now.
    }
    

    然而,C 风格的数组在现代 C++ 中并不是很流行。最好使用std::string(您可以使用clear() 成员函数清除),或者如果您需要在编译时知道大小,请使用std::array&lt;char, N&gt;

    【讨论】:

      【解决方案5】:

      虽然您可以使用std::fill_n(array, 35, ' '),但您可能最好使用std::string,这是C++ 中首选的字符串类。不必关心零终止或任何事情。

      std::string blanks(35, ' ');
      

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 2014-07-15
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多