c ++粘贴值和打印字符串

时间:2017-03-31 09:48:57

标签: c++ paste cout

我声明了2个字符串类型的字符串,qhich是s,s1。我使用s字符串&#c; cin' 我在s1中粘贴3个值。然后我用' cout'但它不能打印字符串。

这是我的代码

#include<iostream>
#include<cstdio>
using namespace std;

int main()

{

    string s,s1;
    cin>>s;
    s1[0]=s[1];
    s1[1]=s[2];
    s1[2]=s[3];
    s1[3]='\0';
    cout<<s1<<endl;
    return 0;
}

s1不是空的...... cout<<s1[0]<<s1[1]<<s1[2]并且看到了。 为什么s1不能打印?

4 个答案:

答案 0 :(得分:1)

可能,完成OP任务的最简单方法是使用像substr()这样的库函数来处理已发布代码丢失的所有细节(并已经指出):

  • 内存管理。第二个字符串s1为空,因此尝试编写其前四个(未分配的)元素是未定义的行为。通常,s1应调整为所需的长度。

  • null终止符。 std::string可以管理它的内部表示,并始终通过其成员函数c_strdata(从C ++ 11开始)返回以null结尾的字符串。

如何做到这一点:

#include <iostream>
#include <string>

int main()
{
    std::string s;

    std::cin >> s;

    std::string s1;
    std::string::size_type start_pos = 1,
                           count = 3;
    if ( s.size() > start_pos )
        s1 = s.substr(start_pos, count);

    std::cout << s1 << '\n';
}

答案 1 :(得分:0)

s1没有任何字符。您正在尝试更改不存在的字符的值。

你的程序有不确定的行为,可能很容易打开骆驼动物园,扭转地球磁场的极性,或解决浴缸中的冷聚变。

  1. 在向其写入内容之前,使s1的大小正确;
  2. 不要写'\0'到最后;这不是C字符串;这是不必要的。 C ++字符串照顾自己。
  3. 以下是一个例子:

    #include <iostream>
    #include <cassert>
    
    int main()
    {
        std::string s, s1;
        std::cin >> s;
    
        assert(s.size() >= 4);
        s1.resize(3);
    
        s1[0] = s[1];
        s1[1] = s[2];
        s1[2] = s[3];
    
        std::cout << s1 << std::endl;
    }
    

    live demo

答案 2 :(得分:0)

您不能指定为s1 [0] = s [1]

正确的方法是使用assign函数:

string s,s1;
cin>>s;
s1.assign(s.begin()+1,s.begin()+4);
cout<<s1<<endl;

答案 3 :(得分:0)

通过在不修复或定义字符串大小的情况下分配索引,无法完成字符串分配。它可能会导致字符串下标错误。如果你想这样做,我认为字符串连接是最好的方法;也就是说,通过在字符串中添加子串或字符串索引。我在下面给出了一些使用字符串连接方法的代码。

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
    string s,s1="";
    cin>>s;
    s1= s1 + s[1];
    s1= s1 + s[2];
    s1= s1 + s[3];
    cout<<s1<<endl;
    return 0;
}