2011-12-15 21 views
0

scanfを操作して関数の入力用に入力を取得する方法がわかりませんreadBigNumユーザがEnterを入力し、配列にそれを割り当てるための関数を書くと私はn個readBigNumが正確に、char *を持つようにしたい多数 のサイズを返すようにしたいが、私は理解していれば、私は私の機能文字列を読み取って配列に代入する

#include <stdio.h> 

int readBigNum(char *n) 
{ 
    char msg[100],ch; 
    int i=0; 
    while((ch=getchar())!='\n') 
    { 
     if(ch!='0'||ch!='1'||ch!='2'||ch!='3'||ch!='4'||ch!='5'||ch!='6'||ch!='7'||ch!='8'||ch!='9') 
      return -1; 
     msg[i++]=ch; 
    } 
    msg[i]='\0'; 
    i=0; 
    return i; 
} 

int main()  
{ 
    const char x; 
    const char n; 
    n=scanf("%d",x); 
    int h=readBigNum(&n); 
    printf(h); 
} 
+0

'(CH!= ...)'ビット、それがためにASCIIコードが ''に至る0''は「シーケンシャル番号順に9''であることに注意することが有用である可能性がある場合。 – AusCBloke

+0

はい、私はasciiの範囲でそれらを呼び出す必要がありますありがとう、私はそれを得た – Nickool

答えて

1

でそれを関連付けることができないあなた正しく質問するには、stdinから数値を読み込んでバッファに格納する関数を実装します。数字以外の数字がある場合は-1を返します。改行が発生した場合は、読み込まれた文字数を返します。

#include <stdio.h> 

int readBigNum(char* n) 
{ 
    char ch; 
    int i=0; 
    while ((ch = getchar()) != '\n') { 
    if (ch < '0' || ch > '9') { 
     return -1; 
    } 
     n[i++] = ch; 
    } 
    n[i] = '\0'; 
    return i; 
} 

int main(void) { 
    char buf[100]; 
    int bytes = readBigNum(buf); 
    printf("%s\n", buf); 
    printf("%d\n", bytes); 
}; 

実装との主な相違点

  • 移入するための配列がメインで初期化とに渡されます。それが正しいなら、あなたはおそらく、あなたのコードは次のようになりたいと思うでしょうreadBigNum関数です。これは、関数がメモリを制御するよりも少し簡単です。その場合は、mallocfreeを処理する必要があります。この場合でも、バッファオーバーランの危険性があり、その防止のために追加の予防措置が必要になる可能性があります。
  • 関数は、返す前にiを0に設定しません。元のコードは、-1(エラー時)または0以外の値を返すことはできませんが、これは意図していないようです。
  • このコードではscanfを使用していません。 scanfを使って達成しようとしていることの説明が与えられていれば、それほどうまくフィットしていないようです。
  • printf呼び出しが正しくないため、返されたバイト数を出力するように更新されました。さらに、更新されたバッファを印刷するためにprintf呼び出しが追加されました。
+0

ありがとう、私はどのように私の関数を関連付けるか分からなかった* n、あなたは絶対に正しいscanfはあなたの変更を呼び出すために適切ではない。 – Nickool

0

chargetchar()戻りintを入力することではない覚えておいてください。これは、関数がEOF(特定の値を持たない負の整数として定義されている)を返す可能性があるためです。

また、バッファを扱う関数では、配列のサイズを記述する余分な引数を取ることをお勧めします。これにより、バッファオーバーランを軽減するのに役立ちます。既存の関数では、ユーザーが100文字以上を入力すると、バッファーがオーバーランします。で

#include <stdio.h> 
#include <ctype.h> 

int readBigNum(char *n, size_t len) 
{ 
    int ch; 
    int i = 0; 

    // we make sure 'i' is less than 'len - 1' to leave space for '\0' 
    while((ch = getchar()) != EOF && i < (len - 1)) 
    { 
     if (ch == '\n')   // stop on linefeed 
      break; 
     else if (!isdigit(ch))) // abort on invalid character 
      return -1; 
     else 
      n[i++] = (char) ch; 
    } 

    msg[i] = '\0'; 
    return i; 
} 

int main(void) 
{ 
    char buf[100]; 
    int result = readBigNum(buf, sizeof buf); 

    if (result > 0) 
     printf("Length %d : %s\n", result, buf); 
    else 
     printf("Invalid number!\n"); 
} 
関連する問題