QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5691|回复: 28

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

[复制链接]
发表于 2009-12-7 23:53:24 | 显示全部楼层 |阅读模式
不管了,我就在这个版块问编程问题了。一点基本的东西,查了资料,自己动手做了做,就是没出结果。
看到这边这么多前辈们做程序,我的疑难杂症就拿过来解决一下。

C++中如果用 & 来传入函数一个参数,可以实现传字符串(废话),可不可以传字符串数组呢?

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. void pass_str(const string &name,const char &name2)
  5. {
  6.         cout << "name: " << name << endl;
  7.         cout << "name2:  " << name2  << endl;
  8. }

  9. void pass_str2(const string str[12][12])  //这个值传的
  10. {
  11.         cout << endl;
  12.         cout << "this is the function output:" << endl;
  13.        
  14.         for(int i=0; i<12; ++i)
  15.         {
  16.                 for(int j=0; j<12; ++j){
  17.                         if(j==0){
  18.                                 cout << endl;
  19.                         }
  20.                         cout << str[i][j] << "   " ;
  21.                 }
  22.         }
  23. }

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

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

  32. int main(int argc, char* argv[])
  33. {
  34.         //printf("Hello World!\n");
  35.         string name("name");
  36.         string ia[12][12];
  37.         for(int k=0; k<12; ++k)
  38.         {
  39.                 ia[0][k]="0 0";
  40.         }
  41.         for(k=0; k<12; ++k){
  42.                 ia[11][k]="11 11";
  43.         }
  44.         for(int i=1; i<11; ++i)
  45.         {
  46.                 for(int j=1; j<11; ++j)
  47.                 ia[i][j]="000";
  48.         }

  49.         pass_str(name, name[1]);

  50.         pass_str2(ia);
  51.         pass_str3(&ia[0][0]);
  52.         pass_str4(ia);
  53.         //cout << *(*(ia+1)+2) << endl;
  54.         return 0;
  55. }
复制代码
纯C++初学者,老鸟就不要笑话了。指点一下。

[ 本帖最后由 zy_sunshine 于 2010-3-12 20:49 编辑 ]
发表于 2009-12-8 00:42:24 | 显示全部楼层
我也记不清楚了,不过&是引用,应该这样写就可以吧.
好像c里用char *p[]或char p[][]的时候可以直接传参数的.
回复

使用道具 举报

发表于 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[m][n]),调用的时候 pass_str4(12,12,ia),C99 标准。
回复

使用道具 举报

发表于 2009-12-8 11:14:00 | 显示全部楼层
我也抛锚在第四种调用。

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

使用道具 举报

发表于 2009-12-8 11:21:05 | 显示全部楼层
字符串数组还是用标准的char吧,string已经是对char的封装了,兄台另类的编程很难过关。
看了一些String[]的写法,可是编译不过去,这才注意了一下,那是JAVA的写法,JAVA也很另类。。。
回复

使用道具 举报

发表于 2009-12-8 12:19:09 | 显示全部楼层
原帖由 haulm 于 2009-12-8 11:21 发表
字符串数组还是用标准的char吧,string已经是对char的封装了,兄台另类的编程很难过关。
看了一些String[]的写法,可是编译不过去,这才注意了一下,那是JAVA的写法,JAVA也很另类。。。 ...


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

使用道具 举报

发表于 2009-12-8 12:36:54 | 显示全部楼层
事实上C++很自由,真正邪恶的是类似于去定义string数组这样的东西。
回复

使用道具 举报

 楼主| 发表于 2009-12-8 12:51:09 | 显示全部楼层

回复 5# haulm 的帖子

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

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

使用道具 举报

发表于 2009-12-8 12:53:19 | 显示全部楼层
原帖由 zy_sunshine 于 2009-12-8 12:51 发表
果然不是C++的写法,混了。都没学好。

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

汗,还是用了string数组么?
回复

使用道具 举报

发表于 2009-12-8 12:59:24 | 显示全部楼层
位运算或者别的什么字符串算法用char,普通显示用字符串还是string更好吧?
回复

使用道具 举报

 楼主| 发表于 2009-12-8 13:01:18 | 显示全部楼层
原帖由 nihui 于 2009-12-8 12:19 发表


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


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

指针,引用
数组 vector
char string
回复

使用道具 举报

 楼主| 发表于 2009-12-8 13:04:24 | 显示全部楼层

回复 9# haulm 的帖子

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

使用道具 举报

 楼主| 发表于 2009-12-8 13:18:02 | 显示全部楼层
原帖由 nihui 于 2009-12-8 10:07 发表
void pass_str3(const string* str)
// 如果string数组元素没有赋值是不会分配内存的,这个是编译行为,所以数据声明时就初始化。

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


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

使用道具 举报

发表于 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 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-12-8 13:35:36 | 显示全部楼层
原来是要这么写的
Array access [] 的优先级要大于 引用&的优先级
m n 那地方还是通过不了,C99的特性在我这个版本的C++没有吗?
  1. void pass_str1(int m, int n, string (& str)[12][12])
  2. {
  3.         cout << endl;
  4.         cout << "this is the function & output:" << endl;

  5.         for(int i=0; i<12; ++i)
  6.         {
  7.                 for(int j=0; j<12; ++j){
  8.                         if(j==0){
  9.                                 cout << endl;
  10.                         }
  11.                         cout << str[i][j] << "   " ;
  12.                 }
  13.         }
  14. }
复制代码

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-27 06:03 , Processed in 0.055825 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表