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

两个字符串连接问题

a16393080 发布于 2009-12-28 20:19, 1213 次点击
#include <iostream.h>
char * f(int *a,int *b);
void main()
{ char m[4]="abc";
char n[3]="de";
  char *k=char *f(m,n);
  delete k;

}
char * f(int *a,int *b)
{int i,j;
  char * s=new char[6];
  for (i=0;i<4;i++)
      s[i]=a[i];
  for (j=0;j<3;j++)
      s[j+4]=b[j];
  return s-5;

}
请问这个错在哪里?
18 回复
#2
forclwy2009-12-28 20:38
char *k=char *f(m,n);
函数调用?不能这么写吧。其它的,你再看看
#3
forclwy2009-12-28 20:42
又是char 还有int的
#4
a163930802009-12-28 20:51
回复 2楼 forclwy
这正是我感到费解的地方呀 不知道怎么改了
#5
zj332009-12-28 21:39
楼主的程序错误比较多, 我重新写了一个。

#include <iostream>
#include <cstring>
using namespace std;
char * f(const char *a, const char *b);

void main( )
{
    char m[ ] = "abc";
    char n[ ] = "de";
    char *k = f(m, n);
    cout << k << endl;
    delete [ ]k;
    k = NULL;
}

char * f(const char *a, const char *b)
{
    int length = strlen(a) + strlen(b) + 1;
    char *s = new char[length];
    int i,j;
    for(i = 0; i < strlen(a); i++)
    {
        s[i] = a[i];
    }
    for(j = 0; j < strlen(b);i++, j++)
    {
        s[i] = b[j];
    }
    s[i] = '\0';
    return s;
}
#6
a163930802009-12-29 09:11
以下是引用zj33在2009-12-28 21:39:38的发言:

楼主的程序错误比较多, 我重新写了一个。

#include <iostream>
#include <cstring>
using namespace std;
char * f(const char *a, const char *b);

void main( )
{
    char m[ ] = "abc";
    char n[ ] = "de" ...
非常感谢您的帮忙!!
我现在把他改成这样:、请问下k=NULL是什么意思?不好意思又得打扰你
#include <iostream.h>
char *f(char *a,char *b);
void main()
{
    char m[4]="abc";
    char n[3]="de";
  char *k=f(m,n);

cout<<k<<endl;
delete  k;
//k=NULL;

}
char *f(char *a,char *b)
{
  char *s;
  s=new char[6];
  for (int i=0;i<3;i++)
      s[i]=a[i];
  for (int j=0;j<2;i++, j++) //如果把这里改成for (j=0;j<2;j++)
      s[i]=b[j];              //s[j+3]=b[j];
  s[i] = '\0';                 // s[6]='\0'; 还是会显示错误,这是为什么?

  return s;
}

[ 本帖最后由 a16393080 于 2009-12-29 09:34 编辑 ]
#7
秀痘魔导士2009-12-29 09:21
以下是引用a16393080在2009-12-29 09:11:54的发言:

非常感谢您的帮忙!!
我现在把他改成这样:、请问下k=NULL是什么意思?不好意思又得打扰你
#include <iostream.h>
char *f(char *a,char *b);
void main()
{
    char m[4]="abc";
    char n[3]="de";
  char *k=f ...
防止悬挂指针,将指针置为NULL,也就是0。这边没有必要。
#8
a163930802009-12-29 09:38
回复 7楼 秀痘魔导士
能不能帮我上面注释的地方解释一下,为什么这样改 程序会出错?
#9
秀痘魔导士2009-12-29 09:54
以下是引用a16393080在2009-12-29 09:38:26的发言:

能不能帮我上面注释的地方解释一下,为什么这样改 程序会出错?
程序代码:
#include <iostream>
using namespace std;
void f(char *a,char *b,char *s);
void main()
{
    char m[4]="abc";
    char n[3]="de";
    char *s = new char[6];
    f(m,n,s);

    cout<<s<<endl;

}
void f(char *a,char *b,char *s)
{
    for (int i=0;i<3;i++)
        s[i]=a[i];
    for (int j=0;j<2;j++) //如果把这里改成for (j=0;j<2;j++)
        s[j+3]=b[j];              //s[j+3]=b[j];
    s[6] = '\0';                 // s[6]='\0'; 还是会显示错误,这是为什么?
}
好好把C++ PRIMER读几遍吧,写得代码太多问题了,返回值和变量生存期好好看一下

#10
a163930802009-12-29 12:15
就是在编写时出了问题,才上来请教的,呵呵。本来按我最初的设想return s返回的是地址,但结果缺不是。
C++ PRIMER(第四版) 习题不是很清晰 如果论坛有提供就好了


[ 本帖最后由 a16393080 于 2009-12-29 12:18 编辑 ]
#11
zj332009-12-29 20:20
错误是因为, char *s = new char[6]; s的元素是s[0],s[1],s[2],s[3],s[4],s[5],而S[6]已经越出数组S的界,s[6] = '\0';就错误了。
#12
a163930802009-12-29 21:19
以下是引用zj33在2009-12-29 20:20:30的发言:

错误是因为, char *s = new char[6]; s的元素是s[0],s[1],s[2],s[3],s[4],s[5],而S[6]已经越出数组S的界,s[6] = '\0';就错误了。
再次感谢你的回复。
请问这里的s是否还是一个指针,能否理解成指针数组?如果我要输出new char[6]这个数组空间的首地址该如何操作?期待你的回答?再次感谢!
#13
zj332009-12-29 22:14
s是一个指针,不是指针数组。给你一个指针数组的例子:
#include <iostream.h>
int main( )
{
    int *p[3];
    for(int i = 0; i < 3; i++)
    {
        p[i] = NULL;
    }
    int j = 3;
    p[0] = &j;
    cout << *p[0] << endl;
    return 0;
}
输出: 3
int *p[3]; p 是指针数组。

s = new char[6]; 不是数组, s是动态分配的一个空间。s是指针,指向这个空间的首地址。
#14
a163930802009-12-29 22:44
以下是引用zj33在2009-12-29 22:14:22的发言:

s是一个指针,不是指针数组。给你一个指针数组的例子:
#include <iostream.h>
int main( )
{
    int *p[3];
    for(int i = 0; i < 3; i++)
    {
        p = NULL;
    }
    int j = 3;
    p[0] = &j;
    co ..
如:
int a;
a=3;
char *p;
p=&a;
cout<<p;
这里输出的p的地址是0x开头的地址,但
char *s=new char[6];
里的s指针指向动态数组,返回的s为什么不是以0x开头的地址而是一串字符串?新申请的动态地址的有六个元素,s指针不是只有一个吗?怎么返回的确是一串字符串?本人在这里卡住了,只能希望你的帮助,谢谢!
#15
zj332009-12-29 23:02
int a = 3; char *p = &a;
 不知道你用的c++编译器是什么?我是VC++6.0, p = &a; 不能编译,不能把int * 转换为 chr *; 即使用强制转换,char * p = (char *)&a; 通过编译,cout <<p;也不可能输出
OX开头的地址,因为c++的cout<<对 char *类型变量, 是打印出字符串。
int a; a既然定义为int,指针p也应该定义为in *;, 才能指向a的地址。
#16
a163930802009-12-30 07:46
以下是引用zj33在2009-12-29 23:02:24的发言:

int a = 3; char *p = &a;
 不知道你用的c++编译器是什么?我是VC++6.0, p = &a; 不能编译,不能把int * 转换为 chr *; 即使用强制转换,char * p = (char *)&a; 通过编译,cout <<p;也不可能输出
OX开头的地址 ...
如:
int a;
a=3;
int *p;
p=&a;
cout<<p;
这里输出的p的地址是0x开头的地址,但
char *s=new char[6];
里的s指针指向动态数组,返回的s为什么不是以0x开头的地址而是一串字符串?新申请的动态地址的有六个元素,s指针不是只有一个吗?怎么返回的确是一串字符串?本人在这里卡住了,只能希望你的帮助,谢谢!
不好意思,打错了  我想问下指向数组的指针怎么不是以0x开头的 。
#17
zj332009-12-30 13:52
s确实是一个指针,只不过cout<<p;的操作是从p所指的地址开始,打印字符,直到遇到空字符为止(即'\0').如果你一定要看到s所指向的地址,可以这样:cout << (int *)s;
这样做是欺骗编译器,把s看成是int型的指针,就可以看到s的以0x开头的地址了。
你看的那本书有点难了,我有一本电子书叫易学c++,刚开始看比较好,关键是多看书,多上机实践.
#18
a163930802009-12-30 18:29
以下是引用zj33在2009-12-30 13:52:52的发言:

s确实是一个指针,只不过cout<<p;的操作是从p所指的地址开始,打印字符,直到遇到空字符为止(即'\0').如果你一定要看到s所指向的地址,可以这样:cout << (int *)s;
这样做是欺骗编译器,把s看成是in ...
谢谢你的帮助!
#19
yangliangbin2009-12-31 09:04
#include <iostream.h>
char * f(char*a,char*b);
void main()
{
    char m[4]="abc";
    char n[3]="de";
    char *k=f(m,n);
    cout<<k<<endl;
    k=NULL;
}
char * f(char *a,char *b)
{
    int i,j;
    char * s=new char[6];
    for (i=0;i<4;i++)
        s[i]=a[i];
    for (j=0;j<3;j++)
        s[j+3]=b[j];
    s[5]='\0';//注意这里是s[5]
    return s;//返回s不用减

}
1