sscanf没有设置int的值

时间:2013-01-31 09:25:59

标签: c

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

谢谢!

3 个答案:

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

请参阅Does C even have ``pass by reference''?

答案 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