Rakshit Arora Ответов: 3

Как я могу поменять местами две строки, используя вызов по значению, а также вызов по ссылке в C?


I want to swap two strings using call by value as well as call by reference. Also, I want to ask the user to input the strings. I want to understand the concept more deeply so please help. 


Что я уже пробовал:

#include<stdio.h> 
void swap(char *str1, char *str2) 
{ 
  char *temp = str1; 
  str1 = str2; 
  str2 = temp; 
}   
   
int main() 
{ 
  char *str1 = "geeks"; 
  char *str2 = "forgeeks"; 
  swap(str1, str2); 
  printf("str1 is %s, str2 is %s", str1, str2); 
  getchar(); 
  return 0; 
} 


но я хочу, чтобы пользователи вводили строки

KarstenK

Вы только меняете местами указатели на строку, а не содержимое памяти строки.

3 Ответов

Рейтинг:
2

OriginalGriff

Хотя Патрис Т прав, это возможно, но для этого вы начинаете усложнять свой код.
Поскольку вызов по значению (по умолчанию для C) всегда передает копию параметра, любые изменения, которые вы вносите в эту переменную внутри функции, не отражаются во внешнем мире - что очень хорошо! Изображение, если вы передали все по ссылке:

void Double(int x)
  {
  x = x * 2;
  }
Затем вызвать его:
int val = 666;
Double(val);
printf("%u", val);
Напечатает то, что вы ожидаете: 1332
Но это не единственный способ, которым вы могли бы это назвать:
Double(666);
printf("%u", 666);
Что это должно было напечатать? 1332? 666? Если это первый, то ваш код будет очень запутанным, очень быстрым! И если это второе ... что случилось с вызовом функции?

Таким образом, параметры передаются по значению, а не по ссылке, поэтому единственный способ повлиять на внешний мир-это передать копию адреса значения, а затем функция может изменить его значение.
void Double2(int* x)
  {
  *x = *x * 2;
  }

int val = 666;
Double2(&val);
printf("%u", val);
Напечатает то, что вы ожидаете: 1332
И
Double2(&666);
printf("%u", 666);
Не будет компилироваться, так как вы не можете взять адрес постоянного значения.

Что возвращает нас к вашей проблеме: с помощью pass by value, как вы меняете местами два указателя?
Просто: вы передаете указатель на указатель на символ:
void swap(char **str1, char **str2) 
  { 
  char *temp = *str1; 
  *str1 = *str2; 
  *str2 = temp; 
  }
А затем вы передаете адрес указателя:
char *str1 = "geeks"; 
char *str2 = "forgeeks"; 
swap(&str1, &str2); 
printf("str1 is %s, str2 is %s", str1, str2);


В этом есть смысл?


Рейтинг:
1

Patrice T

Цитата:
Как я могу поменять местами две строки, используя вызов по значению

Короткий ответ: нет.
Выполняя вызов по значению, вы удаляете любую связь с исходной переменной. Это и есть причина наличия 2-х различных способов вызова.
При вызове по ссылке вы даете ссылку на исходную valiable, при вызове по значению нет ссылки на исходную переменную.


Рейтинг:
0

Rick York

Возьмите много на себя получает - Справочник по c++ [^] для принятия пользовательского ввода.

Единственный известный мне способ подкачки строк по значению включает в себя создание временной копии и последующее копирование обратно в исходные буферы. Это путь, чреватый опасностью, потому что он зависит от размеров буфера, достаточных для хранения новых строк. На самом деле, это настолько опасно, что я думаю, что лучше даже не показывать его вам. Это может быть сделано более безопасным путем передачи размеров буфера, но это добавляет еще один уровень сложности.