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();
}
Строки в C - это массивы символов, которые имеют '\0'
в качестве последнего элемента (с некоторым синтаксическим сахаром для определения таких массивов). Массивы в C не являются гражданами первого класса; в частности, они не могут быть переданы в качестве аргументов. Когда вы передаете массив в функцию, функция получит указатель на первый элемент массива. Указанная память не копируется, только указатель. Из-за этого при изменении указанной в памяти памяти в вызывающей функции изменяется.
C++ унаследовал эти характеристики от C. Если вы хотите использовать строки C, как вы описали, вы должны скопировать их вручную, либо перед передачей их в функцию, либо внутри самой функции.
Однако предпочтительным методом в C++ является использование std::string
из стандартной библиотеки C++. В вашем случае было бы достаточно объявить pass
как
void pass(std::string g)
и замените strlen(g)
на g.length()
.
В C++, когда вы передаете строку, передается базовый адрес строки.
Это означает, что автоматически вызывается по адресу. Поэтому изменения, внесенные в формальные аргументы, отражают фактический аргумент.
Вы не можете передать строку по значению.
Но, альтернативно, вы можете передать каждый символ строки по значению и сохранить каждый символ в другой переменной в этой функции.
Или вы можете сделать временную переменную в функции для хранения исходной строки, а затем внести изменения с временной строкой.
std::string
или тесно связанный. То, что вы сказали, верно для случая, когда вы решаете передать строку C, конечно, но их не следует путать.