因此,我在使用函数替换用字符设置为null的char变量时遇到麻烦。在我的函数内部,可以更改该变量,但是在主函数中,该变量保持为空,因此我不确定自己在做什么。
我写的代码基本上就像
int main(){
char a='\0';
somefunction(a);
return 0;
}
具有功能
somefunction(char a){
scanf(" %c",&a);
}
因此,如果我输入B,则函数中的a值为B,但main中的a值仍为\ 0。
答案 0 :(得分:1)
a仅在本地环境中被更改,因为您传递a的值并且它在本地被更改。
要解决此问题,您需要更改签名,以便可以在更大的上下文中(即调用函数)更改a的值。
尝试类似
somefunction(char *a) {
scanf("%c",a);
}
现在,您传递一个地址(即&a
而不是a),它应该可以工作。
答案 1 :(得分:1)
在C语言中,变量是通过 value 传递的,而不是通过 reference 传递的(除非您另外指定)。也就是说,程序正在将值'\0'
传递给函数,而不是对变量a
的引用。
如果要影响变量本身,则需要使用 pointer 。
void somefunction(char *a){
*a = 'Q';
}
int main(){
char a = '\0';
somefunction(&a);
printf("'%c'", a); /* Prints 'Q' */
}
请注意,在您的示例中,当您将指针传递给scanf
时,已经完成了此操作。
答案 2 :(得分:1)
使用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;
}
答案 3 :(得分:0)
调用somefunction
时,程序将在堆栈上创建a
的新副本。您正在将a
的副本的地址传递到scanf
。函数返回时,main中原来的a
不变。
您需要使somefunction
指向主a
的副本的指针,然后将该指针直接传递到scanf
。
somefunction(char *a) {
scanf(" %c", a);
}
char a;
somefunction(&a);