首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择字符串中的特定字符?

如何选择字符串中的特定字符?
EN

Stack Overflow用户
提问于 2020-07-19 23:20:41
回答 3查看 658关注 0票数 1

我对C++中的字符串操作非常陌生,而且我似乎无法思考如何在字符串中选择字符。下面是我目前的节目。然而,每当我运行它时,程序就会崩溃,并出现一个显示"Thread 1: EXC_BAD.“的错误。出现了(我正在编写Xcode)。出于某种原因,如果我想从字符串中打印第一个字符,那么简单地使用输入就可以了,但是当我在循环中执行inputx时,它就不行了。

代码语言:javascript
复制
#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++的初学者。如果你有任何有帮助的建议,欢迎评论!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-20 03:00:53

您得到错误的原因是:

代码语言:javascript
复制
currentChar = input[y];

这一行的问题是input[y]可能是不可访问的,例如,您的input"Hello"。按照您编写代码的方式,y最终将等于5。然而,您的最后一个字母'o'input[4]。正因为如此,当y=5出现错误时,您将得到一个错误。

有几种方法你可以修复它。其中一个已经提到使用.size()来确保,另一个已经提到使用迭代器:

for(auto iterator = input.begin();iterator!=input.end();++iterator)

但是,我想提到的是,您应该将currentCharpreviousChar声明为char类型,而不是string类型,因为它们总是单个字符。另外,取决于您使用的C++和编译器的版本,如果您正在使用C++11,则"Hello"上的input[5]实际上是可以的。

当您将input[5]传递给char currentChar类型时,currentChar将获得一个空字符。因此,对于while循环,您可以测试while(currentChar)。当currentChar获得空字符时,while循环将测试false,并结束循环。

下面是我如何在您的for循环中进行更改。除了将previousCharcurrentChar更改为char类型之外,它们中的大多数都保持不变,并对它们进行一些条件检查,并进行一些小的更改以对它们进行细化。

代码语言:javascript
复制
#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循环:

代码语言:javascript
复制
#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";
    }
}

下面是如何使用迭代器来完成这个任务:

代码语言:javascript
复制
#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";
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-07-19 23:24:02

代码语言:javascript
复制
    previousChar = input[0];
    currentChar = input[1];

如果输入了空字符串,则不存在input[0]input[1],因此这将成为未定义的行为。

您的总体问题是不正确地检查字符串的结束时间。所示代码尝试在每个位置提取一个字符,将该字符放入自己的std::string中,然后将其与空字符串进行比较。

这不是正确的方法。这最终也会导致未定义的行为,并可能导致崩溃。std::strings有一个size()方法,它给出字符串中的字符数,所以在您的情况下:

代码语言:javascript
复制
input.size()

给出字符串中的字符数。可以是0。然后,您可以迭代字符串的每个字符,然后实现您的逻辑。

票数 1
EN

Stack Overflow用户

发布于 2020-07-20 00:14:16

从我通过阅读您的代码得到的,您正在尝试打印重复字符的数量。我会这样做的方法如下:

代码语言:javascript
复制
  #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++容器,因此我们可以使用迭代器来遍历它(如果您愿意的话,也可以使用循环标准)。

代码为字符串中的每个字符打印重复,正如我想的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62986705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档