我将一个数字int传递给此方法,但它不会将int存储在调用intchange方法的方法中。有什么指针吗?
int intchange(const char *prompt, int number){
char buffer[LINESIZE];
while(1){
printf("%s", prompt);
if(!fgets(buffer,LINESIZE, stdin)){
clearerr(stdin);
return 0;
}
if(sscanf(buffer, "%d", &number) == 1){
/*exit variable */
if(number== -1)
return 0;
else if (number<= 110 && number>= 0)
return 1;
}
}
}
谢谢!
答案 0 :(得分:4)
为了让调用者可以看到更改,您需要将int
的地址传递给intchange()
。否则,正在更改调用者提供的int
的副本,而不是调用者在C传递值时提供的int
:
int intchange(const char* prompt, int* number)
{
/* snip */
if(sscanf(buffer, "%d", number) == 1){ /* Removed address of operator. */
if(*number == -1) /* Dereference to query int value. */
/* snip */
}
}
调用:
int i;
if (intchange("14", &i))
{
printf("i=%d\n", i);
}
答案 1 :(得分:1)
使用指针输入参数编号:
int intchange(const char *prompt, int *number){
if(sscanf(buffer, "%d", number) == 1){
if(*number== -1)
return 0;
else if (*number<= 110 && *number>= 0)
答案 2 :(得分:1)
当您将参数传递给函数时,您将传递它的副本。因此,在您的情况下,int number
参数只是int的副本,它在函数中被赋值,然后在函数返回时消失。
解决方案是这样的:
int intchange(const char *prompt, int* pNumber) {
char buffer[LINESIZE];
while (1) {
printf("%s", prompt);
if (!gets(buffer,LINESIZE, stdin)) {
clearerr(stdin);
return 0;
}
int number;
if(sscanf(buffer, "%d", &number) == 1) {
/*exit variable */
*pNumber = number;
if(number== -1)
return 0;
else if (number<= 110 && number>= 0)
return 1;
}
}
}
在这种情况下,您传入int
的地址(在参数pNumber
中),可以通过指针进行修改。然后你会这样称呼它:
int n;
intchange("prompt", &n);
然后n
将输入值。另见:http://courses.washington.edu/css342/zander/css332/revisit.html