Заменить нуль в символе буквой, используя функцию? - PullRequest
0 голосов
/ 01 февраля 2019

Так что у меня возникли проблемы с заменой переменной char, которую я установил в null, на букву, используя функцию.Внутри моей функции переменная может быть изменена, но в основной функции она остается нулевой, поэтому я не уверен, что делаю.

Код, который я написал, в основном похож на

int main(){

    char a='\0';

    somefunction(a);
return 0;
}

с функцией

somefunction(char a){

scanf(" %c",&a);
}

Так что, если я введу B, значение в функции будет B, но значение в main останется как \ 0.

Ответы [ 4 ]

0 голосов
/ 01 февраля 2019

С кодом scanf(" %c",&a); дает адрес от a до scanf(), поэтому scanf() может назначить что-то по этому адресу.

Сделайте то же самое с somefunction();, дайте ему адрес.

// somefunction(char a){
void somefunction(char *a) {
  // scanf(" %c",&a);
  scanf(" %c", a);
}

int main() {
    char a = '\0';
    // somefunction(a);
    somefunction(&a);
    printf("<%c>\n", a);
    return 0;
}
0 голосов
/ 01 февраля 2019

В C переменные передаются по значению , а не по ссылке (если не указано иное).То есть программа передает значение '\0' вашей функции, а не ссылку на переменную a.

Если вы хотите повлиять на саму переменную, вам нужно использовать указатель .

void somefunction(char *a){
    *a = 'Q';
}

int main(){
    char a = '\0';
    somefunction(&a);
    printf("'%c'", a); /* Prints 'Q' */
}

Обратите внимание, что вы уже сделали это один раз в своем примере, когда передаете указатель на scanf.

0 голосов
/ 01 февраля 2019

Когда вы вызываете somefunction, ваша программа создает новую копию a в стеке.Вы передаете адрес этой копии a на scanf.Когда ваша функция возвращается, оригинал a в main не изменяется.

Вам нужно заставить somefunction взять указатель на копию main a, а затем передать этот указатель непосредственно в scanf.

somefunction(char *a) {
    scanf(" %c", a);
}

char a;
somefunction(&a);
0 голосов
/ 01 февраля 2019

a изменяется только в локальном контексте, так как вы передаете значение a, и оно изменяется локально.

Чтобы исправить это, вам нужно изменить сигнатуру, чтобы вы могли изменить значение a в более широком контексте (например, вызывающей функции.

Попробуйте что-то вроде

somefunction(char *a) {
    scanf("%c",a);
}

А теперь вы передаете адрес a (т.е. &a вместо a), и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...