-1

こんにちは、C の学習を始めたばかりで、ここで問題が発生する理由を知りたい.. char ポインタを渡したい

char *temp;

関数に、つまり関数の呼び出し

checkIfUniqueCourseNo(temp,k);

プロトタイプで

int checkIfUniqueCourseNo(char checkchar[4],int);

および関数ヘッダー

int checkIfUniqueCourseNo(char checkchar[4], int k)

ここで本当にばかげたことをしていると確信していますが、それを修正する方法がわかりません:(事前に感謝します.ps私のエラーは、checkchar [4]がPを出力することです...

例 - -

temp = "123A"
checkIfUniqueCourseNo(temp,k);

int checkIfUniqueCourseNo(char checkchar[4], int k){
    printf("CheckifUniqueCourse\n");
    printf("Check Value = %c \n", checkchar);

    return 0;
}

出力 = チェック値 = P

4

4 に答える 4

1
temp = "123A" 
checkIfUniqueCourseNo(temp,k);  

int checkIfUniqueCourseNo(char checkchar[4], int k){
  printf("CheckifUniqueCourse\n");
  printf("Check Value = %c \n", checkchar);
                                ^^^^^^^^^
  return 0; 
} 

の最初の文字を印刷しようとしている場合はcheckchar、この行を次のいずれかに変更する必要があります。

printf("Check Value = %c\n", *checkchar);

また

printf("Check Value = %c\n", checkchar[0]);

関数パラメーター宣言のコンテキストでは、T a[N]およびは;とT a[]同等です。の配列ではなく、へのポインタとして宣言されています。 T *aaTT

あなたが書いたとき

printf("Check Value = %c\n", checkchar);

あなたは嘘をついたprintf; あなたは引数がタイプcharであることになっていると言いました、しかしあなたは。を渡しましたchar *。したがって、偽の出力。

文字列 全体を印刷する場合は"1234"、その行を次のように変更する必要があります。

printf("Check value = %s\n", checkchar);

今回は、%s変換指定子を使用して、0で終了する配列(別名文字列) printfcheckchar指していることを示します。char

于 2012-04-27T14:56:28.963 に答える
0

Cを実行してからしばらく経ちますが、ここでいくつかの問題が発生します。temp = "123A"実際には5文字の配列が必要です(そのうちの1つは、「\ 0」文字列の終了文字を含めることです)。

次に、この行printf("Check Value = %c \n", checkchar);はメモリポインタを文字として出力しようとしているようで、次のように変更しますprintf("Check Value = %s \n", checkchar);。終了文字に到達するまで、配列内の各文字を出力します。

于 2012-04-27T14:55:49.223 に答える
0

これはまったく明確ではありません。に値を割り当てていますtempか? もしそうなら、何?

プロトタイプを次のようにする方が理にかなっています。

int checkIfUniqueCourseNo(char* checkchar, int);

どこから4を入手したかはまったく明らかではないためです。

于 2012-04-27T14:44:36.593 に答える
0

ここで確認すべき点がいくつかあります。所有しているデータ、データがどのように表されているか、データで何をしたいのかをよく調べる必要があります。

あなたのコースコードは 4 文字の文字列のように見えます。伝統的に、C の文字列には末尾にゼロ (NUL) の値を持つ余分なバイトが含まれていることを知っておく必要があります。文字列の終わり。

あなたの場合、4 桁のコードは 5 バイトのメモリを占有します。そのため、関数に渡すのにうまく適合しません。

私があなただったら、次のようにポインタを渡します:-

int checkIfUniqueCourseNo(char* coursecode, int k ) {
  int rv = -1;
  if ( coursecode == NULL ) return rv;
  //...

Kが何のためにあるのかわからないよね?

関数内に一連のバイトを取得したら、次のようにデータに対して簡単な境界チェックを行うことで、後で手間を省くことができます。

  //...
  if ( strlen(coursecode) > 4 ){
    fprintf(stderr,"course code too long\n");
    return rv;
  }

  if ( strlen(coursecode) < 4 ){
    fprintf(stderr,"course code too short\n");
    return rv;
  }
  //...

これで 4 文字の文字列ができたことを確認できます。

于 2012-04-27T19:16:26.357 に答える