簡體   English   中英

sscanf未設置int的值

[英]sscanf not setting value of an int

我將數字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;
       }
     }
  }

謝謝!

為了使更改對調用者可見,您需要將int地址傳遞給intchange() 否則的副本int由調用者提供正被改變,而不是int為C提供的呼叫者經過值:

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甚至有``通過引用傳遞''嗎?

使用指針作為輸入參數編號:

int intchange(const char *prompt, int *number){

if(sscanf(buffer, "%d", number) == 1){

if(*number== -1)
      return 0;
   else if (*number<= 110 && *number>= 0)

當您將參數傳遞給函數時,就是在傳遞它的副本。 因此,在您的情況下, int number參數只是int number的副本,該副本在函數中分配給它,然后在函數返回時消失。

解決方案是這樣的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM