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

[求助]改正串的一个问题

绝对冰点 发布于 2007-10-30 22:43, 443 次点击
我的水平很菜,所以写的程序也很菜,经常需要大家帮忙,我在这个论坛学到很多,之前学了c++,感觉我什么都没学到,感觉到学习编程的前途渺茫,但现在有了论坛的各位帮忙,有点感觉了。一段时间之后肯定会好起来的。

这个程序是将b串插入到a串的第i个之后,我写的总是运行不成功。希望大家帮忙看看。还有就是老是找不对位置。
#include <iostream>
#include <string.h>
using namespace std;
char *insert(char *,int,char *);
const int N=20;
void main()
{
char a[N]="abcdef";
char b[]="xyz";
cout << "input i\n";
int i;
cin >> i;
insert(a,i,b);
cout << a <<endl;
}
char *insert(char *m,int i,char *n)
{
if(strlen(m)+strlen(n)>=N)
cout << "overflow!\n";
else
{
int j;
for(j=strlen(m);j>=i;j--)
m[j+strlen(n)]=m[j];
for(j=0;j<=strlen(n);j++)
m[j+i-1]=n[j];
}
return m;
}

输入3
输出abxyz


8 回复
#2
Janlex2007-10-30 22:57

for(j=strlen(m)-1;j>=i;j--)
m[j+strlen(n)]=m[j];
for(j=0;j<=strlen(n)-1;j++)
m[j+i]=n[j];

#3
chen179812007-10-31 00:32
或许,更好的方法是利用string.

#include <iostream>
#include <string>

using namespace std;

int main()
{
string a = "aaaaaa";
string b = "bbbbbb";

int pos = 1;

b.insert(b.begin()+pos, a.begin(), a.end());

cout << b << endl;

return 0;
}
#4
poppylx2007-10-31 00:44
楼主要的就是算法~~~~

char *insert(char *m,int i,char *n)
{
int iFirstLen = strlen(m);
int iSecondLen = strlen(n);
if(iFirstLen + iSecondLen >=N || i > iFirstLen )
{
cout << "overflow!\n";
}
else
{
int j;
for( j = iFirstLen - 1; j > i - 1; --j)
{
m[ j + iSecondLen ] = m[j];
}
for( j = 0; j < iSecondLen; ++j)
{
m[ j + i ] = n[ j ];
}
}
return m;
}
#5
hegj2007-10-31 17:59
问个问题,2楼和4楼的做法,在字符串最后有'\0'吗?  貌似没有,但是输出正常。
#6
绝对冰点2007-10-31 20:58

j = iFirstLen - 1
这个语句不是把‘\0’给空出来了么?我个人认为。
见笑了

#7
vczxz2007-11-01 12:58
using namespace std;
我看了好多这个语句,是什么意思啊
本人不材,请教一下
#8
绝对冰点2007-11-01 20:28
我也是才知道不久,在vs2005中好像必须要加上这句,要不不能编译,具体原因也不知道
#9
hegj2007-11-01 22:38

还是不明白
以i = 3 为例
若 j = strlen(m)-1;
abcdef\0********
| |
| m[j+strlen(n)]
|
m[j]
于是变成
abcdefdef*******
|
|
m[j+i] = n[i]
于是变成
abcxyzdef*******
不是没有\0 吗?

using namespace std;
是使用名字空间std;
因为 cin,cout等都在名字空间中声明,如果不使用名字空间std 编译器就不知道cout,cin等,好像是这样的。
不对的请指出。


1