使用 for 循环打印字符串数组无法正常工作 (C++)
Printing string array with for-loop doesn't function properly (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;
}
现在,预期的输出显然是数组。但我通常得到的是这样的:呃阿瓦沃阿什(L % !我#E K H v!H H %H = ! { !我 H =_! 问 ! T H D A D ;u u u H e E1 H [等]
提前感谢!
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;
}
否则,如果不使用 C++11 或更高版本的编译器,请考虑使用std::vector
:
#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;
}
for 循环中的此条件
i < sizeof(stArr)
没有意义。它不提供数组中的元素数。
至少你必须写
i < sizeof(stArr) / sizeof( *stArr )
例如,如果您有一个包含N
个类型为T
的元素的数组,则使用此公式计算数组的大小
sizeof( array ) = N * sizeof( T )
因此,要获得数组中元素的数量,知道它的大小和元素的大小,你可以写
N = sizeof( array ) / sizeof( T )
但是使用基于范围的 for 循环要简单得多。
for ( const auto &s : stArr ) std::cout << s;
如果您的编译器支持 C++ 17,则可以使用在标头<iterator>
中声明的标准泛型函数std::size
。例如
#include <iostream>
#include <string>
#include <iterator>
using namespace std;
int main() {
string stArr[] = {" 1 | ","_"," | ","_"," | ","_"," | "};
for ( size_t i = 0; i < size( stArr ); i++) {
cout << stArr[i];
}
}
否则,您可以通过以下方式使用标头std::extent
<type_traits>
定义的结构
#include <iostream>
#include <string>
#include <type_traits>
using namespace std;
int main() {
string stArr[] = {" 1 | ","_"," | ","_"," | ","_"," | "};
for ( size_t i = 0; i < extent<decltype( stArr )>::value; i++) {
cout << stArr[i];
}
}
检查,sizeof(strArray
的值是多少(。我敢打赌你假设它是 7(即数组中的字符串数量(。
剧透:嗯,最清楚的不是。sizeof(strArray)
返回整个数组占用的模因量,即 7 个字符串。它是一个大于 7 的数字,因此在迭代期间,您会读取数组边界之外的内存。
将其除以一个元素的大小(例如sizeof(strArray)/sizeof(string)
(得到您要花费的大小。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程