我对C++中的字符串操作非常陌生,而且我似乎无法思考如何在字符串中选择字符。下面是我目前的节目。然而,每当我运行它时,程序就会崩溃,并出现一个显示"Thread 1: EXC_BAD.“的错误。出现了(我正在编写Xcode)。出于某种原因,如果我想从字符串中打印第一个字符,那么简单地使用输入就可以了,但是当我在循环中执行inputx时,它就不行了。
#include <iostream>
#include <string>
int num, characterCount;
string currentChar, previousChar;
int main()
{
cout << "How many lines of input? \n";
cin >> num;
for (int x = 0; x < num; x++)
{
string input;
cin >> input;
previousChar = input[0];
currentChar = input[1];
characterCount = 0;
int y = 0;
while (currentChar != "")
{
y++;
if (previousChar == currentChar)
{
characterCount++;
}
else if (previousChar != currentchar && currentChar != "")
{
cout << characterCount << " " << previousChar;
characterCount = 0;
}
else if (currentChar == "")
{
cout << characterCount << " " << previousChar;
}
previousChar = currentChar;
currentChar = input[y];
}
}
return 0;
}顺便说一句,我知道我的代码很奇怪,我是C++的初学者。如果你有任何有帮助的建议,欢迎评论!
发布于 2020-07-20 03:00:53
您得到错误的原因是:
currentChar = input[y];这一行的问题是input[y]可能是不可访问的,例如,您的input是"Hello"。按照您编写代码的方式,y最终将等于5。然而,您的最后一个字母'o'是input[4]。正因为如此,当y=5出现错误时,您将得到一个错误。
有几种方法你可以修复它。其中一个已经提到使用.size()来确保,另一个已经提到使用迭代器:
for(auto iterator = input.begin();iterator!=input.end();++iterator)
但是,我想提到的是,您应该将currentChar和previousChar声明为char类型,而不是string类型,因为它们总是单个字符。另外,取决于您使用的C++和编译器的版本,如果您正在使用C++11,则"Hello"上的input[5]实际上是可以的。
当您将input[5]传递给char currentChar类型时,currentChar将获得一个空字符。因此,对于while循环,您可以测试while(currentChar)。当currentChar获得空字符时,while循环将测试false,并结束循环。
下面是我如何在您的for循环中进行更改。除了将previousChar和currentChar更改为char类型之外,它们中的大多数都保持不变,并对它们进行一些条件检查,并进行一些小的更改以对它们进行细化。
#include <iostream>
#include <string>
int main() {
int num;
std::cout << "How many lines of input? \n";
std::cin >> num;
for (int x = 0; x < num; x++)
{
std::string input;
std::cin >> input;
char previousChar = input[0];
int y = 1;
char currentChar = input[y];
int characterCount = 1;
while(currentChar)
{
y++;
if (previousChar == currentChar)
{
characterCount++;
}
else
{
std::cout << characterCount << " " << previousChar << "\n";
characterCount = 1;
}
previousChar = currentChar;
currentChar = input[y];
}
std::cout << characterCount << " " << previousChar << "\n";
}
}另外,请注意,在为我迭代索引时使用while循环感觉很奇怪。因此,我可能会使用for循环而不是while循环:
#include <iostream>
#include <string>
int main() {
int num;
std::cout << "How many lines of input? \n";
std::cin >> num;
for (int x = 0; x < num; x++)
{
std::string input;
std::cin >> input;
char previousChar = input[0];
int y = 1;
char currentChar = input[y];
int characterCount = 0;
for(int y = 1; currentChar; y++)
{
if (previousChar == currentChar)
{
characterCount++;
}
else
{
std::cout << characterCount << " " << previousChar << "\n";
characterCount = 1;
}
previousChar = currentChar;
currentChar = input[y];
}
std::cout << characterCount << " " << previousChar << "\n";
}
}下面是如何使用迭代器来完成这个任务:
#include <iostream>
#include <string>
int main() {
int num;
std::cout << "How many lines of input? \n";
std::cin >> num;
for (int x = 0; x < num; x++)
{
std::string input;
std::cin >> input;
char previousChar, currentChar;
previousChar = input[0];
int characterCount = 1;
for(auto it = input.begin()+1; it != input.end();it++)
{
currentChar = *it;
if (previousChar == currentChar)
{
characterCount++;
}
else
{
std::cout << characterCount << " " << previousChar << "\n";
characterCount = 1;
}
previousChar = currentChar;
}
std::cout << characterCount << " " << previousChar << "\n";
}
}发布于 2020-07-19 23:24:02
previousChar = input[0];
currentChar = input[1];如果输入了空字符串,则不存在input[0]和input[1],因此这将成为未定义的行为。
您的总体问题是不正确地检查字符串的结束时间。所示代码尝试在每个位置提取一个字符,将该字符放入自己的std::string中,然后将其与空字符串进行比较。
这不是正确的方法。这最终也会导致未定义的行为,并可能导致崩溃。std::strings有一个size()方法,它给出字符串中的字符数,所以在您的情况下:
input.size()给出字符串中的字符数。可以是0。然后,您可以迭代字符串的每个字符,然后实现您的逻辑。
发布于 2020-07-20 00:14:16
从我通过阅读您的代码得到的,您正在尝试打印重复字符的数量。我会这样做的方法如下:
#include <iostream>
#include <string>
int num, characterCount;
int main()
{
std::cout << "How many lines of input? \n";
std::cin >> num;
for (int x = 0; x < num; x++)
{
characterCount=0;
std::string input;
std::cin >> input;
for(auto iterator = input.begin();iterator!=input.end();++iterator)
{
if(iterator == input.end()-1)
std::cout <<"Duplicates: " << characterCount
<< " " <<"Character: "<< *iterator << "\n";
else
{
if(*iterator == *std::next(iterator,1))
characterCount++;
else
{
std::cout <<"Duplicates: " << characterCount
<< " " <<"Character: "<< *iterator << "\n";
characterCount=0;
}
}
}
}
return 0;
}首先,您没有使用std命名空间。您需要使用std::,就像在每次调用特定命名空间之前我在下面所做的那样,或者在包含指令之后,只需在文件顶部使用using namespace std即可。
第二,我放弃了使用先前字符和当前字符的算法,转而使用迭代器。字符串是标准模板库中的标准c++容器,因此我们可以使用迭代器来遍历它(如果您愿意的话,也可以使用循环标准)。
代码为字符串中的每个字符打印重复,正如我想的那样。
https://stackoverflow.com/questions/62986705
复制相似问题