bugfix> c > 投稿

特にwhileループで

  1. getchar()関数にどの変数を供給していますか?

  2. この機能は有効ですか? gets()、fgets()、scanf()などのさまざまな「読み取り」関数で問題が発生します。これは他のような問題を与えるでしょうか?

    char * mygets(char *s) {
      int i = 0, ch;
      while ((ch = getchar()) != '\n')
        s[i++] = ch;
      s[i] = '\0';
      return s;
    }
    main() {
      char input[21];
      printf("type anything:\n");
      mygets(input);
      printf("output: %s\n", input);
    }
    
    
回答 2 件
  • getchar(3)またはgets(3)関数を使用すると、入力はプロセス標準入力から読み取られます。

    The getchar() function is equivalent to getc(stdin).

    Getsは一度に1文字を読み取るため、読み取った文字をカウントする必要があり、「使用可能なスペースの端からはみ出さない」ようにする必要があります。つまり、sの「サイズ」を渡す必要があります。

    char*
    mygets(char *s) {
        //is s a valid pointer to memory?
        //how much space is available in s?
        int i = 0, ch;
        //what is the maximum value of an int?
        //what happens when i++ exceeds MAX_INT?
        //does -1 make sense?
        //getchar(3) can return EOF
        while ((ch = getchar()) != '\n')
            s[i++] = ch;
        s[i] = '\0';
        return s;
    }
    
    

    代わりにこのようなものを試してください。読み取った文字をカウントし、渡されたバッファーの終わりを超えないことを確認します。

    char*
    mygets(char* s, const size_t size) {
        if( !s ) return s; //error, null pointer passed
        size_t count=0;
        char* sp = s;
        int ch;
        for( ; (count<size) && ((ch = getchar()) != EOF); ) {
            ++count; //count each character read, but not EOF
            if( (*sp++ = ch) == '\n' ) break; //store characters read, check for newline
        }
        *sp = '\0'; //null terminate s
        return s;
    }
    
    

    サイズには正気の値のみを、sには正気の値のみを渡す必要があります(有効なcharバッファの少なくとも サイズ)。使用例:

    char buffer[999];
    mygets(buffer, 999); //or mygets(buffer, sizeof(buffer));
    
    

  • 1)getchar()は、入力されたとおりに1文字を取得します。...キーボードで1文字入力するのを「待機」します。

    2)これは基本的な機能です。文字を使ってこれらのことを行うためのはるかに最適で高度な機能があります。

    乾杯...

あなたの答え