-1
void main(int argc, char * argv[])
{ 
  FILE* inFile = NULL;
  char * bufferFromStdin;
  char buf[100];
  printf("Enter something:\n");
  scanf("%s", buf);
  printf("First scan from stdin is: %s\n", buf);

  if(buf == "THIS" || buf[0]=='T')
   {
    printf("THIS found first\n");
   }
   else {printf("Not Found first\n");}


   printf("Enter something again:\n");
   scanf("%s", bufferFromStdin);
   printf("Second scan from stdin is: %s\n", bufferFromStdin);
   if(bufferFromStdin == "THIS")
   {
    printf("THIS found second\n");
   }
   else {printf("Not Found second\n");}
}//main

出力が得られます:
./test < testinput.txt
何かを入力してください:
stdin からの最初のスキャンは: THIS
THIS found first
もう一度入力してください:
stdin からの 2 番目のスキャンは: (null)
Not Found second

testinput.txt には、「THIS」という 1 行のテキストがあります。

これは、入力を通常の stdin としてプログラムを実行したときに得られるものです ./test
何かを入力してください:
THIS標準入力
からの最初のスキャンは: THIS
THIS 最初に見つかっ
たものです もう一度何かを入力してください:
THIS標準入力
からの 2 番目のスキャンは: (null)
Not Found second

どちらの入力方法を使用しても、入力を char* に保存できないのはなぜですか。これを回避するにはどうすればよいですか? キーボードで標準入力から入力を取得し、I/O をリダイレクトする必要もあります。malloc(); と関係があると思います。

助けてくれてありがとう。

4

2 に答える 2

2

コードに重大なエラーが 2 つあります。まず、bufferFromStdin割り当てられたメモリを指していません。結果を格納する場所にscanf(例のように) 以前に割り当てられたメモリへのポインタが必要です。buf結果などの初期化されていない変数を渡すとbufferFromStdin、結果は未定義です。

第 2 に、==C の演算子は 2 つのポインターを比較しますが、ポインターが何を指しているのかは比較しません。したがって、は定数配列を指していないため、 buf == "THIS"true になることはありません。buf2 つの文字列を比較するには、 を使用しますstrcmp。もちろん、これが機能するには、両方のポインターが何かを指している必要があります。

また、補足として、常にnotmainを返す必要があります。intvoid

これら 2 つの問題を修正すると、コードが機能するはずです。

int main(int argc, char * argv[])
{ 
  char buf[100];
  printf("Enter something:\n");
  scanf("%s", buf);
  printf("First scan from stdin is: %s\n", buf);

  if(strcmp(buf, "THIS") == 0) {
    printf("THIS found first\n");
  } else {printf("Not Found first\n");}

  return 0;
}
于 2012-09-23T06:33:19.303 に答える
0

コードにいくつかのプログラミング エラーがあります。

void main(int argc, char * argv[])
{ 
  FILE* inFile = NULL;
  char * bufferFromStdin;
  char buf[100];

3 つの異なるスタイルを使用して、3 つのポインター変数を割り当てています。

  • inFile正しく初期化されています (NULL ポインター)。
  • bufferFromStdin初期化されていません。
  • buf初期化され、静的に割り当てられた領域を指します。

おそらく、C でメモリを割り当てる方法を確認したいと思うでしょう。

  printf("Enter something:\n");
  scanf("%s", buf);

このscanf呼び出しは少し危険です。ユーザーが 99 文字を超える文字列を挿入すると (\0 ターミネータを思い出してください)、バッファがオーバーフローします。おそらくこの質問を確認したいでしょう。

  printf("First scan from stdin is: %s\n", buf);

  if(buf == "THIS" || buf[0]=='T')

申し訳ありませんが、これはかなり面白いと思います。文字列の等価性 (ポインターではなくコンテンツ) をテストしたいのですが、最初のテストが機能しない (ポインターを比較している) ことがわかったので、2 番目のテストを追加します。マニュアルページを確認してください。

   {
    printf("THIS found first\n");
   }
   else {printf("Not Found first\n");}

私はこれも少し醜いと思います。インデントの 1 つのスタイルに固執したい場合があります。

   printf("Enter something again:\n");
   scanf("%s", bufferFromStdin);

初期化されていないポインタを使用しています。ここで何が起こるかは、プログラミング環境、オペレーティング システム、コンパイラによって異なります。強力なオペレーティング システムは、おそらくプログラムを終了させます。または、一部のメモリ領域が破損しています。

   printf("Second scan from stdin is: %s\n", bufferFromStdin);
   if(bufferFromStdin == "THIS")

上記と同じ問題ですが、回避策を実装するのを忘れていました。

   {
    printf("THIS found second\n");
   }
   else {printf("Not Found second\n");}
}//main
于 2012-09-23T06:38:16.950 に答える