注册 登录
编程论坛 C++教室

请问这个str1为什么输出不了?

ke_liu 发布于 2020-03-12 23:01, 6353 次点击
下面这段程序我直接写"cout<<str1;",好像什么都没有输出;
而我直接这样写"cout<<str1[0]<<str1[1]<<……;",是可以输出的。
我也查了一下在C++中string类型的变量直接写名称是可以输出的,不知道为什么在这里就不行了
题目:有一字符串,包含n个字符。写一函数将此字符串中从第m个字符开始的全部字符复制成为另外一个字符串。
代码:
程序代码:
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
    string str;
    void Partial_replication(string);
    cout<<"请输入一个字符串:"<<endl;
    cin>>str;
    Partial_replication(str);
    return 0;
}
void Partial_replication(string str)
{
    int StringLength(string str);
    string str1;
    int n,m,i=0;
    char *p,*p1;
    n=StringLength(str);
    cout<<"请输入被复制的字符个数m,(m<"<<n<<"):" ;
    cin>>m;
    for(p=&str[m-1],p1=&str1[0];p<=&str[n-1];p++,p1++)
    *p1=*p;
    cout<<"被复制的部分字符串为:"<<str1<<endl;     
}
int StringLength(string str)
{
    char *p;
    int i=0;
    for(p=&str[0];*p!='\0';p++)
    i++;
    return i;
}

这是我的运行结果:
只有本站会员才能查看附件,请 登录
35 回复
#2
rjsp2020-03-13 09:38
str1 是空的,你怎么可以往里面写东西?
另外,从你的代码来看,你得卖本真正的C++书籍去学一下。

写一函数将此字符串中从第m个字符开始
cout<<"请输入被复制的字符个数m,(m<"<<n<<"):" ;
你自己说的两句话矛盾么,到底这个m是起始位置,还是被复制的字符个数?


程序代码:
#include <iostream>
#include <string>
using namespace std;

std::string foo( const std::string& s, size_t offset );

int main( void )
{
    cout << "请输入一个字符串:";
    string str;
    if( !(cin>>str) )
        return 1;

    cout << "请输入欲被复制的字符起始位置:";
    size_t idx;
    if( !(cin>>idx) )
        return 1;

    string result = foo(str, idx);
    cout << "被复制的部分字符串为:" << result << endl;
}

std::string foo( const std::string& s, size_t offset )
{
    if( offset < s.size() )
        return string(s, offset);
    return string();
}
输入 abc 和 0, 输出 abc
输入 abc 和 1, 输出 bc
输入 abc 和 2, 输出 c
输入 abc 和 3, 输出 空
输入 abc 和 4, 输出 空
……
#3
ke_liu2020-03-13 13:47
回复 2楼 rjsp
这个str一开始也是空的,为什么就可以在str里写东西,而不可以在str1里写?
#4
rjsp2020-03-13 13:50
回复 3楼 ke_liu
cin>>str; 这个operator >>会调用str的resize分配空间
而你的代码 p1=&str1[0] 则直接使用不存在的内存
#5
ke_liu2020-03-13 13:58
回复 4楼 rjsp
谢谢,我还想问一下为什么我这样写:cout<<str1[0]<<str1[1]……;是可以输出来呢?
#6
叶纤2020-03-13 14:29
回复 5楼 ke_liu
我觉得你应该疑惑解答人的代码,
比如
程序代码:

if( offset < s.size() )
        return string(s, offset);//这一句刷了我三观,比大小然后返回参数就能得到结果了,
    return string();

#7
叶纤2020-03-13 15:24
程序代码:
//这个你应该能看懂
#include <iostream>

using namespace std;
//输入字符串,输入数字,从数字后输入字符
//知道字符串的长度,然后输入长度后面的字符
int main()
{
    string a={};
    cin>>a;//字符
    size_t b=a.size();
    size_t c=0;
    cin>>c;//要输入数字
    for(size_t i=c;i<b;++i)
        cout<<a[i];//打印数字后的字符
    return 0;
}


#8
rjsp2020-03-13 15:34
以下是引用ke_liu在2020-3-13 13:58:49的发言:
谢谢,我还想问一下为什么我这样写:cout<<str1[0]<<str1[1]……;是可以输出来呢?
对于错误的代码(未定义行为),讨论它的输出是没有意义的。

如果一定要说的话,
对于 cout<<str1<<endl,你的代码没有修改 str1 的size,所以str1依然认为自己是空字符串




#9
xianfajushi2020-03-13 16:30
只能算是作一半.

[此贴子已经被作者于2020-3-14 13:51编辑过]

#10
ke_liu2020-03-13 17:56
回复 8楼 rjsp
你所说的这个“str1的size”,指的是str1长度吗?如果是的话,这个string类型的变量的长度不是不需指定,只随其中输入的字符串长度而改变的吗?
如果不是我所认为的那样的话,那就先这样吧。
谢谢!
#11
ke_liu2020-03-13 17:57
回复 6楼 叶纤
对,看的我一脸懵逼
#12
ke_liu2020-03-13 17:59
回复 9楼 xianfajushi
我就是先复制在str1里,然后在输出的
#13
叶纤2020-03-13 18:04
回复 9楼 xianfajushi
那你提供完整正确的代码啊?我们吃瓜群众学习就行。本人还是比较喜欢能直接复制粘贴可以直接输出带有main函数的代码。如果你要写请让我们吃瓜群众可以正常的品尝下您的代码
#14
叶纤2020-03-13 18:10
回复 11楼 ke_liu
我刚开始学的时候也不知道size_t是r版主教会了我,你查查资料或者看我资料我发的第一条问题贴就能找到答案,希望你能坚持下去,r版主的代码都是很值得学习的,请原谅我的盲目崇拜,
#15
叶纤2020-03-13 18:22
还有看你的代码,一方面感觉逻辑不通,一方面感觉和我学的教材不一样,额忘了告诉你我也是新手,推荐你一个学习网站,www.,个人认为讲的很全面,就是极度的考验耐心,我一般看不下去了就喜欢逛逛论坛
#16
ke_liu2020-03-13 18:40
回复 15楼 叶纤
好的,谢谢
#17
xianfajushi2020-03-13 18:46
使用string变量很容易实现这个题目,不用指针虾米的那么麻烦。
判断长度就不写了,调用现成函数获取输入字符串长度即可,看看
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-3-14 13:59编辑过]

#18
xianfajushi2020-03-13 18:46
要一个个字符添加也容易,有调用现成函数,也有按位置赋值的,都很简单。
假如认可之上图中的代码,那就弄成一个处理函数就可以了,实现题目全面。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2020-3-13 20:03编辑过]

#19
xianfajushi2020-03-13 21:57
说的真是逗乐。。。

[此贴子已经被作者于2020-3-14 14:01编辑过]

#20
xianfajushi2020-03-13 21:57
不稀奇。


[此贴子已经被作者于2020-3-14 13:48编辑过]

#21
xianfajushi2020-03-13 22:10


[此贴子已经被作者于2020-3-14 13:52编辑过]

#22
xianfajushi2020-03-13 22:13


[此贴子已经被作者于2020-3-14 13:49编辑过]

#23
xianfajushi2020-03-13 22:16


[此贴子已经被作者于2020-3-14 13:49编辑过]

#24
xianfajushi2020-03-13 22:21



[此贴子已经被作者于2020-3-14 13:50编辑过]

#25
xianfajushi2020-03-13 22:25
?啊


[此贴子已经被作者于2020-3-14 13:47编辑过]

#26
xianfajushi2020-03-13 22:27
。。。

[此贴子已经被作者于2020-3-14 13:48编辑过]

#27
xianfajushi2020-03-13 22:39


[此贴子已经被作者于2020-3-14 13:47编辑过]

#28
xianfajushi2020-03-13 23:04
这些闲聊与主题无关删了吧。炉子不可浇也。

[此贴子已经被作者于2020-3-14 14:02编辑过]

#29
xianfajushi2020-03-14 01:44

    for (p = &str[m - 1]; p <= &str[n - 1]; p++)
        str1.push_back(*p);

程序代码:

void Partial_replication(string str)
{
    int StringLength(string str);
    string str1 = str;
    int n, m, i = 0;
    char *p, *p1;
    n = StringLength(str);
    cout << "请输入被复制的字符个数m,(m<" << n << "):";
    cin >> m;
    for (p = &str[m - 1], p1 = &str1[0]; p <= &str[n - 1];)
        *p1++ = *p++;
    while(*p1)*p1++ = 0;
    cout << "被复制的部分字符串为:" << str1 << endl;
}


[此贴子已经被作者于2020-3-14 01:52编辑过]

#30
ke_liu2020-03-14 11:39
回复 37楼 xianfajushi
请问一下"while(*p1)*p1++ = 0;"这句是干什么的?
#31
xianfajushi2020-03-14 11:45
把它注释掉运行看看就知道干嘛用的。
以下是引用ke_liu在2020-3-14 11:39:21的发言:

请问一下"while(*p1)*p1++ = 0;"这句是干什么的?

#32
ke_liu2020-03-14 11:46
在各位大佬的相助下,这个问题我解决了,只不过有一点小瑕疵(空格没有删除),我搜了一下那个删除空格的函数,结果看不懂,超出了我的范围,就先这样行了吧!
程序代码:
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
    int m;
    string str,str1;
    int StringLength(string);
    void Partial_replication(string,int,string);
    cout<<"请输入一个字符串:"<<endl;
    cin>>str;
    cout<<"请输入被复制的部分字符串的起始字符在原字符串中的位置m(m<"<<StringLength(str)<<")";
    cin>>m;
    Partial_replication(str,m,str1);
    return 0;
}
void Partial_replication(string str,int m,string str1)
{
    int StringLength(string str);
    char *p=&str[0];
    int i=0;
    for(m=m-1;m;p++,m--)
    *p=0;
    str1=str;
    cout<<str1<<endl;
}
int StringLength(string str)
{
    char *p;
    int i=0;
    for(p=&str[0];*p!='\0';p++)
    i++;
    return i;
}
#33
ke_liu2020-03-14 11:47
以下是引用xianfajushi在2020-3-14 11:45:22的发言:

把它注释掉运行看看就知道干嘛用的。

ok,我试试
#34
ke_liu2020-03-14 12:06
以下是引用xianfajushi在2020-3-14 11:45:22的发言:

把它注释掉运行看看就知道干嘛用的。

注释掉之后,一些字符就会重复打印,明明只复制了一次,为什么会这样呢?
这个指针p,在for循环之后不是已经指向了str1的地址的后面了么,怎么while循环之后str1里重复的就没有了?
#35
xianfajushi2020-03-14 13:55
这就是传说中的太极
#36
xianfajushi2020-03-14 16:58
修改了2处,2次赋值。    string str1 = str;    while(*p1)*p1++ = 0;
以下是引用ke_liu在2020-3-14 12:06:43的发言:


注释掉之后,一些字符就会重复打印,明明只复制了一次,为什么会这样呢?
这个指针p,在for循环之后不是已经指向了str1的地址的后面了么,怎么while循环之后str1里重复的就没有了?

1