zy_sunshine 发表于 2009-12-7 23:53:24

一个C++编程问题 用&方式传递字符串数组

不管了,我就在这个版块问编程问题了。一点基本的东西,查了资料,自己动手做了做,就是没出结果。
看到这边这么多前辈们做程序,我的疑难杂症就拿过来解决一下。

C++中如果用 & 来传入函数一个参数,可以实现传字符串(废话),可不可以传字符串数组呢?
#include <iostream>
#include <string>
using namespace std;

void pass_str(const string &name,const char &name2)
{
        cout << "name: " << name << endl;
        cout << "name2:" << name2<< endl;
}

void pass_str2(const string str)//这个值传的
{
        cout << endl;
        cout << "this is the function output:" << endl;
       
        for(int i=0; i<12; ++i)
        {
                for(int j=0; j<12; ++j){
                        if(j==0){
                                cout << endl;
                        }
                        cout << str << "   " ;
                }
        }
}

void pass_str3(const string* str)       //这个传的首地址,但是发现,如果string数组元素没有赋值是不会分配内存的,输出上有点小麻烦。
{
        cout << *(str+12*12-1) << endl;
}

void pass_str4(const string &str[][])      //这个地方我想要实现字符串数组 &传参,怎样做呢?
{
        cout << str << endl;
}

int main(int argc, char* argv[])
{
        //printf("Hello World!\n");
        string name("name");
        string ia;
        for(int k=0; k<12; ++k)
        {
                ia="0 0";
        }
        for(k=0; k<12; ++k){
                ia="11 11";
        }
        for(int i=1; i<11; ++i)
        {
                for(int j=1; j<11; ++j)
                ia="000";
        }

        pass_str(name, name);

        pass_str2(ia);
        pass_str3(&ia);
        pass_str4(ia);
        //cout << *(*(ia+1)+2) << endl;
        return 0;
}纯C++初学者,老鸟就不要笑话了。指点一下。

[ 本帖最后由 zy_sunshine 于 2010-3-12 20:49 编辑 ]

sejishikong 发表于 2009-12-8 00:42:24

我也记不清楚了,不过&是引用,应该这样写就可以吧.
好像c里用char *p[]或char p[][]的时候可以直接传参数的.

nihui 发表于 2009-12-8 10:07:38

void pass_str3(const string* str)
// 如果string数组元素没有赋值是不会分配内存的,这个是编译行为,所以数据声明时就初始化。

void pass_str4(const string &str[][])   // <--- 参数不能直接这样写,无法预知二维的宽。
void pass_str4( int m, int n, const string &str),调用的时候 pass_str4(12,12,ia),C99 标准。

haulm 发表于 2009-12-8 11:14:00

我也抛锚在第四种调用。

[ 本帖最后由 haulm 于 2009-12-8 13:46 编辑 ]

haulm 发表于 2009-12-8 11:21:05

字符串数组还是用标准的char吧,string已经是对char的封装了,兄台另类的编程很难过关。
看了一些String[]的写法,可是编译不过去,这才注意了一下,那是JAVA的写法,JAVA也很另类。。。

nihui 发表于 2009-12-8 12:19:09

原帖由 haulm 于 2009-12-8 11:21 发表 http://www.linuxfans.org/bbs/images/common/back.gif
字符串数组还是用标准的char吧,string已经是对char的封装了,兄台另类的编程很难过关。
看了一些String[]的写法,可是编译不过去,这才注意了一下,那是JAVA的写法,JAVA也很另类。。。 ...

如果只是 c++,尽量少用指针、数组、#define 等被 c++ 认为是邪恶的东西,而使用引用、STL 容器、inline 内联~
但是理论和实践总是要联系的   :-D

haulm 发表于 2009-12-8 12:36:54

事实上C++很自由,真正邪恶的是类似于去定义string数组这样的东西。

zy_sunshine 发表于 2009-12-8 12:51:09

回复 5# haulm 的帖子

果然不是C++的写法,混了。都没学好。

by nihui
void pass_str4( int m, int n, const string &str),调用的时候 pass_str4(12,12,ia),C99 标准。
我就是想要这种效果,呵呵,谢谢了。

haulm 发表于 2009-12-8 12:53:19

原帖由 zy_sunshine 于 2009-12-8 12:51 发表 http://www.linuxfans.org/bbs/images/common/back.gif
果然不是C++的写法,混了。都没学好。

by nihui
void pass_str4( int m, int n, const string &str),调用的时候 pass_str4(12,12,ia),C99 标准。
我就是想要这种效果,呵呵,谢谢了。 ...
汗,还是用了string数组么?

jiangtao9999 发表于 2009-12-8 12:59:24

位运算或者别的什么字符串算法用char,普通显示用字符串还是string更好吧?

zy_sunshine 发表于 2009-12-8 13:01:18

原帖由 nihui 于 2009-12-8 12:19 发表 http://www.linuxfans.org/bbs/images/common/back.gif


如果只是 c++,尽量少用指针、数组、#define 等被 c++ 认为是邪恶的东西,而使用引用、STL 容器、inline 内联~
但是理论和实践总是要联系的   :-D

完全同意:o
不过像引用,STL容器,inline,iterator,等等,这些东西内部的运行原理还有待于查看源码和反复验证。先搞熟悉了二维数组和string,再去看STl。 vector和数组之间有好多地方相同,vector iterator中又有好多特性,而且vector的初始化也多用数组地址来初始化。

指针,引用
数组 vector
char string

zy_sunshine 发表于 2009-12-8 13:04:24

回复 9# haulm 的帖子

如果不用string数组,而用char的话不是更麻烦吗?
或者用vector,好主意。

zy_sunshine 发表于 2009-12-8 13:18:02

原帖由 nihui 于 2009-12-8 10:07 发表 http://www.linuxfans.org/bbs/images/common/back.gif
void pass_str3(const string* str)
// 如果string数组元素没有赋值是不会分配内存的,这个是编译行为,所以数据声明时就初始化。

void pass_str4(const string &str[][])   //...

还是不行,但是感觉你这种方法应该可以成功的,莫非我的C++版本低了点,确实是,我一直是用VC6.0做。

haulm 发表于 2009-12-8 13:31:50

g++ a.cpp
a.cpp:4: 错误:‘str’声明为 array of references
a.cpp: In function ‘void pass_str4(...)’:
a.cpp:6: 错误:‘str’在此作用域中尚未声明
a.cpp:6: 错误:‘m’在此作用域中尚未声明
a.cpp:6: 错误:‘n’在此作用域中尚未声明
a.cpp: In function ‘int main(int, char**)’:
a.cpp:21: 警告:不能通过‘...’传递有非简单旧数据类型‘struct std::string’的对象;调用会在运行时中止
我就没能成功过,你写成功了就贴个看看,我觉得其实就是char *处理更简单,不想折腾了。

[ 本帖最后由 haulm 于 2009-12-8 13:32 编辑 ]

zy_sunshine 发表于 2009-12-8 13:35:36

原来是要这么写的
Array access [] 的优先级要大于 引用&的优先级
m n 那地方还是通过不了,C99的特性在我这个版本的C++没有吗?void pass_str1(int m, int n, string (& str))
{
        cout << endl;
        cout << "this is the function & output:" << endl;

        for(int i=0; i<12; ++i)
        {
                for(int j=0; j<12; ++j){
                        if(j==0){
                                cout << endl;
                        }
                        cout << str << "   " ;
                }
        }
}

[ 本帖最后由 zy_sunshine 于 2010-3-12 20:52 编辑 ]
页: [1] 2
查看完整版本: 一个C++编程问题 用&方式传递字符串数组