c++ - 使用 for 循环打印字符串数组无法正常工作(C++)
问题描述
我是 C++ 的新手,只是想玩一些东西,在这种情况下特别是数组。我想将一个字符串数组打印到控制台,但它要么以二进制形式打印随机的东西,要么告诉我我遇到了分段错误,要么什么也不做。
最初的程序有点复杂,但我试图尽可能减少额外的事情,这样我就可以看到问题所在,但没有成功。
#include <iostream>
#include <string>
using namespace std;
int main() {
string stArr[] = {" 1 | ","_"," | ","_"," | ","_"," | "};
for(int i = 0; i < sizeof(stArr); i++) {
cout << stArr[i];
}
return 0;
}
现在,预期的输出显然是数组。但我通常得到的是这样的:UH��AWAVAUATSH��(L�%�!I���#�E�K��H��v!H��H��%H�=�!” {�!I��H���I�����H�=_!�Q�!���t�H�D��A��D����;u��u�u ……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
提前致谢!
解决方案
sizeof(stArr)
为您提供整个数组的总字节大小。它不会为您提供您正在寻找的元素计数。因此,您的循环超出了数组的范围,这就是您在输出中得到垃圾的原因。
要获取数组的元素计数,您需要将数组的字节大小除以数组中单个元素的大小,例如:
#include <iostream>
#include <string>
int main() {
std::string stArr[] = {" 1 | ","_"," | ","_"," | ","_"," | "};
int count = sizeof(stArr) / sizeof(stArr[0]);
for(int i = 0; i < count; ++i) {
std::cout << stArr[i];
}
return 0;
}
话虽如此,如果您使用的是 C++17 或更高版本的编译器,则可以使用它std::size()
来获取静态数组的元素计数:
#include <iostream>
#include <string>
#include <iterator>
int main() {
std::string stArr[] = {" 1 | ","_"," | ","_"," | ","_"," | "};
size_t count = std::size(stArr);
for(int i = 0; i < count; ++i) {
std::cout << stArr[i];
}
return 0;
}
或者,如果您使用的是 C++11 编译器,则可以std::extent
改用:
#include <iostream>
#include <string>
#include <type_traits>
int main() {
std::string stArr[] = {" 1 | ","_"," | ","_"," | ","_"," | "};
size_t count = std::extent<decltype(stArr)>::value;
for(int i = 0; i < count; ++i) {
std::cout << stArr[i];
}
return 0;
}
也就是说,如果您使用的是 C++11 或更高版本的编译器,请考虑std::array
改用:
#include <iostream>
#include <string>
#include <array>
int main() {
std::array<std::string, 7> stArr = {" 1 | ", "_", " | ", "_", " | ", "_", " | "};
// or: in C++17 and later:
// std::array stArr{" 1 | ", "_", " | ", "_", " | ", "_", " | "};
std::size_t count = stArr.size();
for(size_t i = 0; i < count; ++i) {
std::cout << stArr[i];
}
return 0;
}
或者,您也可以使用基于范围的for
循环:
#include <iostream>
#include <string>
int main() {
std::string stArr[] = {" 1 | ", "_", " | ", "_", " | ", "_", " | "};
// or std::array...
for(auto &s : stArr) {
std::cout << stArr[i];
}
return 0;
}
否则,std::vector
如果您不使用 C++11 或更高版本的编译器,请考虑使用:
#include <iostream>
#include <string>
#include <vector>
int main() {
std::vector<std::string> stArr;
stArr.push_back(" 1 | ");
stArr.push_back("_");
stArr.push_back(" | ");
stArr.push_back("_");
stArr.push_back(" | ");
stArr.push_back("_");
stArr.push_back(" | ");
std::size_t count = stArr.size();
for(size_t i = 0; i < count; ++i) {
std::cout << stArr[i];
}
return 0;
}
推荐阅读
- elasticsearch - 带有部分的弹性搜索模板
- ldap - 从内部目录迁移到 LDAP 时在 JIRA 中维护用户历史记录
- sql-server - 如何处理带有 [ ] 方括号的表名?
- php - PHP file_get_contents 在 OpenStreetMap API 中使用 & 代替 & 并返回 403
- sql - SQL查询如何在不同条件下从同一张表的两列中划分值
- typescript - 指定对象文字的属性是只读的
- android - 单击两次相同的选项卡文本/图标时如何使选项卡式页面导航?
- sharepoint - 如何解决我的问题:无法使用 csom (c#) 为列表的自定义内容类型设置默认内容类型?
- angular - in angular, sourceMap and aot/buildOptimizer Can't they be generated at the same time?
- kubernetes - Specify max number of pods in a node using KOPS