【问题标题】:string is not printing in c++ outside the a for loop字符串未在 a for 循环之外的 C++ 中打印
【发布时间】:2021-01-28 12:51:50
【问题描述】:

我尝试使用 c++ 分隔给定字符串中的 A-Z 字符,但分隔的字符串未在输出中打印,但如果我在 for 循环内移动“cout”语句,它会打印字符。我不知道为什么会这样。如果我做错了,请告诉我。

我的代码

#include<iostream>

using namespace std;

int main()
{
    int t;
    cin>>t;    //number of test cases

    while(t--)
    {
        string s,a,n;
        int j=0,k=0;
        char temp;

        cin>>s;      //getting string

        for(int i=0; i<s.length(); i++)
        {

            if(s[i]>=65 && s[i]<=90)       //checking for alphabets
            {
                a[j]=s[i];
                j++;
                cout<<a[j-1]<<endl;
            }

            else
            {
                n[k]=s[i];
                k++;
                cout<<n[k-1]<<endl;
            }

        }

        cout<<endl<<a<<endl<<n;       //this line is not printing
     }
}

【问题讨论】:

  • 编译一个调试版本并在你最喜欢的调试器中运行程序。调试器会告诉你出了什么问题

标签: c++ string c++11 output stdstring


【解决方案1】:

字符串a在初始化后为空(即它的长度为0)。因此,您不能使用 a[j] 访问/写入任何字符,因为这会超出字符串的当前边界并产生未定义的行为。

使用...

a.push_back(s[i]);

在字符串末尾追加一个字符。

【讨论】:

    【解决方案2】:

    由于a 开头为空,并且正如其他答案所说,您正在写入超出字符串的当前范围,您可以通过执行以下操作将其大小调整为s

    a.resize(s.size());
    

    并且,一旦你完成了工作,减少它的容量以适应实际大小:

    a.shrink_to_fit();
    

    这样您就不会像使用std::string::push_back 时那样重新分配内存。

    【讨论】:

    • 我可以使用 s.length() 而不是 s.size()。两者都表达相同的意思吗?
    • 是的,这些是同义词
    • 在使用 shrink_to_fit 时显示错误 - [Error] 'std::string' has no member named 'shrink_to_fit' 我需要包含任何库
    • @SarweshArivazhagan 它编译得很好。在这里查看godbolt.org/z/o9jf5K
    【解决方案3】:

    此外,您可以在第一个 if 条件中使用 isupper() 函数。 但首先你必须首先将 s[i] 初始化为 char 变量 for 循环并添加 #include&lt;cctype&gt; 库。像这样:

    char c = s[i];
    if(isupper(c)){
    代码
    }

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多