一个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 编辑 ] 我也记不清楚了,不过&是引用,应该这样写就可以吧.
好像c里用char *p[]或char p[][]的时候可以直接传参数的. 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 13:46 编辑 ] 字符串数组还是用标准的char吧,string已经是对char的封装了,兄台另类的编程很难过关。
看了一些String[]的写法,可是编译不过去,这才注意了一下,那是JAVA的写法,JAVA也很另类。。。 原帖由 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 事实上C++很自由,真正邪恶的是类似于去定义string数组这样的东西。
回复 5# haulm 的帖子
果然不是C++的写法,混了。都没学好。by nihui
void pass_str4( int m, int n, const string &str),调用的时候 pass_str4(12,12,ia),C99 标准。
我就是想要这种效果,呵呵,谢谢了。 原帖由 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数组么? 位运算或者别的什么字符串算法用char,普通显示用字符串还是string更好吧? 原帖由 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
回复 9# haulm 的帖子
如果不用string数组,而用char的话不是更麻烦吗?或者用vector,好主意。 原帖由 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做。 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 编辑 ] 原来是要这么写的
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