萌出血 发表于 2020-10-8 03:12:40

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

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

int main(void)
{
      char arr1 = "Hello world";
      print_strin(arr1);
      chararr2;
      arr2 = 'H';
      arr2 = 'e';
      arr2 = 'l'
      arr2 = 'o'
      ...
      arr2 = 'd';
      return 0;
}


输出:Hello wo

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

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

void print_string(char[] arr, int length); // length 是数组的长度
我现在疑惑的是,为啥会打印Hello wo,共8个字节?sizeof(arr)/sizeof(arr)不应该返回数组的长度吗?为啥返回8呢?来个懂得老哥说一下。

萌出血 发表于 2020-10-8 03:14:35

当然因为我直到数组的长度,直接
for(int i=0; i<11; i++)
{
      cout << arr
}
就行了,输出Hello world,但是我想知道的是,为啥sizeof(arr)/sizeof(arr)返回的是Hello wo呢,刚好是8个字节?

萌出血 发表于 2020-10-8 03:16:46

@大佬

liuzhengyuan 发表于 2020-10-8 08:43:31

你这个代码本身运行不了,有很多语法错误

萌出血 发表于 2020-10-8 12:53:36

楼上的不要装逼,代码是可以运行的

萌出血 发表于 2020-10-8 12:54:23

@真正的大佬

萌出血 发表于 2020-10-8 12:57:27

我只是写了有疑惑的部分,为了大家方便观看我在写一遍

...

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

整个函数,我想的是遍历一个char[]数组然后逐个打印每个字符,比如Hello,就输出Hello
但是调用整个函数,Hello world(共11个字符),只输出了Hello wo,那后几个字符去哪里了呢?(输出了8个字节)

风过无痕1989 发表于 2020-10-8 13:39:06

萌出血 发表于 2020-10-8 12:57
我只是写了有疑惑的部分,为了大家方便观看我在写一遍

...


你得将整个程序发出来,别人才能知道,你的错误出在哪里。你只发片断,没有上下文,叫别人怎么帮你?

萌出血 发表于 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); i++)
      {
                cout<<str;
      }
      cout << endl;
}

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

    return 0;
}

这个输出结果为啥是 Hello wo?sizeof(str) 为啥是8

风过无痕1989 发表于 2020-10-8 16:58:57

萌出血 发表于 2020-10-8 15:32
#include

using namespace std;


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

萌出血 发表于 2020-10-8 17:51:20

我搞清楚了,问题出在这里

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

我是64bit机器,所以指针长度等于8…… 问题解决

萌出血 发表于 2020-10-8 17:57:09

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

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

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

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

还是很基础的吧

萌出血 发表于 2020-10-8 17:57:58

C++真是太有趣了

萌出血 发表于 2020-10-8 18:00:00

也就是paraments和arguments的区别

萌出血 发表于 2020-10-8 18:02:04

我对Java比较熟悉,Java就不会出现这种问题
因为“Java只有值传递”,这么基础的问题不应该

风过无痕1989 发表于 2020-10-8 21:34:12

萌出血 发表于 2020-10-8 17:57
我在终端运行和你一样,也是
code ➤ ./a.out                                                ...

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

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

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

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

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

4) 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。

萌出血 发表于 2020-10-8 22:24:59

哈哈,此帖终结。懂的都懂。
页: [1]
查看完整版本: C++ 写函数遍历打印char[]数组的每一个元素