-1

このメソッドに数値 int を渡していますが、intchange メソッドを呼び出すメソッドに int が格納されていません。ポインタはありますか?

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

呼び出し元が変更を認識できるようにするには、 のアドレスintに渡す必要がありますintchange()。それ以外の場合は、C が値渡しするときにint提供される呼び出し元ではなく、呼び出し元によって提供される のコピーが変更されます。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);
}

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 に答える