鱼C论坛

 找回密码
 立即注册
查看: 3413|回复: 16

[技术交流] C++ 写函数遍历打印char[]数组的每一个元素

[复制链接]
发表于 2020-10-8 03:12:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void print_string(char [] str)
{
        for(int i=0; i<sizeof(str)/sizeof(str[0]); i++)
        {
                cout  <<  str[i];
        }
        cout << endl;
}

int main(void)
{
        char arr1[40] = "Hello world";
        print_strin(arr1);
        char  arr2[40];
        arr2[0] = 'H';
        arr2[1] = 'e';
        arr2[2] = 'l'
        arr2[3] = 'o'
        ...
        arr2[10] = 'd';
        return 0;
}


输出:Hello wo

那后面rld几个字符去哪里了呢?我感觉问题出在

i < sizeof(arr[i])/sizeof(arr[i])这句话,如果这样改就行了

void print_string(char[] arr, int length); // length 是数组的长度
我现在疑惑的是,为啥会打印Hello wo,共8个字节?sizeof(arr)/sizeof(arr[0])不应该返回数组的长度吗?为啥返回8呢?来个懂得老哥说一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-10-8 03:14:35 | 显示全部楼层
当然因为我直到数组的长度,直接
for(int i=0; i<11; i++)
{
        cout << arr[i]
}
就行了,输出Hello world,但是我想知道的是,为啥sizeof(arr)/sizeof(arr[i])返回的是Hello wo呢,刚好是8个字节?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 03:16:46 | 显示全部楼层
@大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 08:43:31 | 显示全部楼层
你这个代码本身运行不了,有很多语法错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2020-10-8 12:53:36 | 显示全部楼层
楼上的不要装逼,代码是可以运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 12:54:23 | 显示全部楼层
@真正的大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 12:57:27 | 显示全部楼层
我只是写了有疑惑的部分,为了大家方便观看我在写一遍

...

void print_string(char [] str)
{
        for(int i=0; i<sizeof(str)/sizeof(str[0]); i++)
        {
                cout  <<  str[i];
        }
        cout << endl;
}

整个函数,我想的是遍历一个char[]数组然后逐个打印每个字符,比如Hello,就输出Hello
但是调用整个函数,Hello world(共11个字符),只输出了Hello wo,那后几个字符去哪里了呢?(输出了8个字节)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 13:39:06 | 显示全部楼层
萌出血 发表于 2020-10-8 12:57
我只是写了有疑惑的部分,为了大家方便观看我在写一遍

...

你得将整个程序发出来,别人才能知道,你的错误出在哪里。你只发片断,没有上下文,叫别人怎么帮你?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 15:32:50 | 显示全部楼层
风过无痕1989 发表于 2020-10-8 13:39
你得将整个程序发出来,别人才能知道,你的错误出在哪里。你只发片断,没有上下文,叫别人怎么帮你?

#include <iostream>

using namespace std;

void print_string(char str[])
{
        for(int i=0; i<sizeof(str)/sizeof(str[0]); i++)
        {
                cout  <<  str[i];
        }
        cout << endl;
}

int main(void)
{
    char arr[40] = "Hello world";
    print_string(arr);

    return 0;
}

这个输出结果为啥是 Hello wo?sizeof(str) 为啥是8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 16:58:57 | 显示全部楼层
萌出血 发表于 2020-10-8 15:32
#include

using namespace std;

我用MV++6.0运行你的程序结果如下,不像你说的没输出完,而是连续输出了四次。C++我还没学,发图出来,让其他的朋友来帮助你吧

C  .jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2020-10-8 17:51:20 | 显示全部楼层
我搞清楚了,问题出在这里

void print_string(char a[]);
整个函数,传递的a实际上是一个指向数组首地址的指针,和下面的函数声明等价
void print_string(char*);

我是64bit机器,所以指针长度等于8…… 问题解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 17:57:09 | 显示全部楼层
风过无痕1989 发表于 2020-10-8 16:58
我用MV++6.0运行你的程序结果如下,不像你说的没输出完,而是连续输出了四次。C++我还没学,发图出来,让 ...

我在终端运行和你一样,也是
code &#10148; ./a.out                                                                                                         
Hello worldHello worldHello worldHello worldHello worldHello worldHello worldHello world

主要是搞清楚实参和形参的区别……
void print_string(char []);
void print_string(char *s);

这两个声明是等价的。
但是在main函数中,
char s[40] = "Hello world";
这里的s就是指整个数组的名字,sizeof运算后返回该数组的长度等于40

还是很基础的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 17:57:58 | 显示全部楼层
C++真是太有趣了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 18:00:00 | 显示全部楼层
也就是paraments和arguments的区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 18:02:04 | 显示全部楼层
我对Java比较熟悉,Java就不会出现这种问题
因为“Java只有值传递”,这么基础的问题不应该
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-8 21:34:12 | 显示全部楼层
萌出血 发表于 2020-10-8 17:57
我在终端运行和你一样,也是
code &#10148; ./a.out                                                  ...

C++我还没学,但C++作为C语言的继承和发展,应该与C语言有诸多的相似和联系。下面就是C语言的开参与实参区别与联系,供参考:

C语言函数的参数会出现在两个地方,分别是函数定义处和函数调用处,这两个地方的参数是有区别的。
形参(形式参数)
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。

形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
形参和实参的区别和联系
1) 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。

2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。

3) 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。

4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-8 22:24:59 | 显示全部楼层
哈哈,此帖终结。懂的都懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 23:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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