-1

我将一个数字 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;
       }
     }
  }

谢谢!

4

3 回答 3

4

为了使调用者可以看到更改,您需要将 in 的地址传递给. 否则,调用者提供的副本将被更改,而不是作为 C 提供的调用者按值传递:intintchange()intint

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);
}

请参阅C 是否有“按引用传递”?.

于 2013-01-31T09:29:55.303 回答
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)
于 2013-01-31T09:32:26.613 回答
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;
    }
  }
}

在这种情况下,您传递的是(在参数中)的地址,可以通过指针进行修改。然后你会这样称呼它:intpNumber

int n;
intchange("prompt", &n);

然后n会有值输入。另见:http ://courses.washington.edu/css342/zander/css332/revisit.html

于 2013-01-31T09:32:54.373 回答