gpt4 book ai didi

c++ - 使用 for 循环打印字符串数组无法正常运行 (C++)

转载 作者:行者123 更新时间:2023-11-30 04:44:09 31 4
gpt4 key购买 nike

我是 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 ����H�e�E1��H� [等]

提前致谢!

最佳答案

sizeof(stArr) 为您提供整个数组的总字节大小。它不会为您提供您正在寻找的元素计数。因此,您的循环超出了数组的边界,这就是您在输出中出现垃圾的原因。

要获取数组的元素个数,需要用数组的字节大小除以数组中单个元素的大小,eg:

#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;
}

或者,您也可以使用 ranged-based for loop :

#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;
}

关于c++ - 使用 for 循环打印字符串数组无法正常运行 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893906/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com