Turbo C ++:我想在不更改原始数据的情况下将字符串传递给函数(按值传递)。如何在这段代码中实现???
#include<iostream.h>
#include<conio.h>
#include<string.h>
void pass(char g[20])
{
g[0]=g[2];
cout<<"\nPassed: ";
for(int i=0;i<strlen(g);i++)
cout<<g[i];
}
void main()
{
clrscr();
char a[20];
cout<<"\nEnter the Data: ";
cin.get(a,sizeof a);
int len=strlen(a);
pass(a);
cout<<"\nAfter pass: ";
for(int i=0;i<len;i++)
cout<<a[i];
getch();
}
答案 0 :(得分:5)
C中的字符串是以'\0'
作为最后一个元素的字符数组(用一些语法糖来定义这样的数组)。 C中的数组不是一等公民;特别是,它们不能作为参数传递。将数组传递给函数时,该函数将接收指向数组第一个元素的指针。指向内存不会被复制,只有指针是。因此,在修改指向内存时,修改调用函数中的内存。
C ++从C继承了这些特性。如果你想使用你所描述的C字符串,你必须手动复制它们,或者在将它们传递给函数之前,或者在函数本身内复制它们。
但是,C ++中的首选方法是使用C ++标准库中的std::string
。在您的情况下,将pass
声明为
void pass(std::string g)
并将strlen(g)
替换为g.length()
。
答案 1 :(得分:0)
在C ++中传递字符数组时,会传递字符数组的基址。
这意味着自动按地址调用。这就是为什么对正式参数的更改反映回实际参数。
您无法按值传递字符数组。
但另外,您可以按值传递字符串的每个字符,并将每个字符存储在该函数的另一个变量中。
或者您可以在函数中创建一个临时变量来存储原始字符串,然后使用临时字符串进行更改。
您也可以使用std:string类而不是字符数组。在这种情况下,简单地传递变量将完成工作(通过值传递)。