理解 C++ 中的 <string> 字符串数组

Posted

技术标签:

【中文标题】理解 C++ 中的 <string> 字符串数组【英文标题】:Understanding <string> String Arrays in C++ 【发布时间】:2019-11-24 04:32:55 【问题描述】:

使用字符串库,我试图让用户输入多行符号,稍后我将对其进行翻转。对我来说,最明显的方法似乎是使用字符串数组,但是,尽管我相信我的输入系统是正确的,但我的输出始终是一大串随机符号,最终导致“中止”。我想做的事是不可能的吗?如果是,为什么,如果不是,我将如何解决这个错误?

#include <iostream>
#include <string>
using namespace std;

/* Function Declarations */
string flipHouse();

int main() 
        string flipped = flipHouse();
        cout<<flipped;
        return 0;


string flipHouse() 
        int n;
        cout<<"Enter the number of lines: ";
        cin>>n;
        string house[n];
        cout<<"Enter the house image:"<<endl;
        for (int i = 0; i < n+1; i++)
                getline(cin,house,'\n');
        for (int i = 0; i < n+1; i++)
                cout<<house[i];

return house[n];


【问题讨论】:

这是为你编译的? 翻转是什么意思? @DavidO 是的,确实如此。 @0x499602D2 例如,如果用户输入 ///[,输出将是“]\\\”。 【参考方案1】:
string house[n];

此数组包含n 字符串。有效索引为 0 ... n-1。越界访问数组的行为是未定义的。

for (int i = 0; i < n+1; i++)
        cout<<house[i];

在最后几次迭代中,您最多可以访问 n 个索引。该索引位于数组末尾之后。

return house[n];

这里返回索引 n 中的字符串。这再次超过了最后一个索引。程序的行为未定义。

另一个问题是n 不是编译时常量值。因此,它可能不能用作 C++ 中数组的大小。

【讨论】:

非常感谢!这是否意味着我无法将变量作为数组中的字符串数? @DylanDalal 不一定。您可以将 const 变量与编译时常量初始化器一起使用。 谢谢你们!我一定会研究这两个建议。 string house[n]n 变量实际上不是有效的 C++。可变长度数组是一些编译器支持的非标准扩展。如果你想要一个包含一组n 字符串的容器,请使用vector&lt;string&gt; house(n) 或(更完整)std::vector&lt;std::string&gt; house(n)

以上是关于理解 C++ 中的 <string> 字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

这是 C++ 中的有效数据结构 Map<string, string, string> 吗?

如何理解这段代码片段中的两对括号?

理解 C++ .Net 中的 String^

C++ ifstreamofstream ifstream 读取并输出文件中的string

C++ ifstreamostringstream istringstream 读取并输出文件中的string

C++ ifstreamostringstream istringstream 读取并输出文件中的string