web-dev-qa-db-ja.com

文字へのポインターでscanf関数を使用する

次のコードを書きました。

int main(){
   char arrays[12];
   char *pointers;
   scanf("%s",arrays);
   scanf("%s",pointers);
   printf("%s",arrays);
   printf("%s",pointers);
   return 0;
}

`scanf("%s "、pointers)と入力するとエラーが発生するのはなぜですか?

11
Saurabh.V
char *pointers; 

初期化する必要があります。アドレスを指定するまで、文字列をpointersにスキャンすることはできません。コンピューターは、キーボードから読み取った値をどこに保存するかを知る必要があります。

int main(){
   char arrays[12];
   char *pointers= arrays;
   scanf("%s",pointers);
   printf("%s",pointers);
   return 0;
}
14
Junior Fasco

初期化されていないメモリのアドレスに書き込んでいるためです。初期化されていないポインタによってメモリポインタに書き込むと、未定義の動作が呼び出されます。十分なメモリを割り当てるか:

pointers = malloc(256);
if(!pointers)
  perror("malloc");
else
  scanf("%255s", pointers);

または、静的配列として宣言します。

char pointers[256];

Scanf()の代わりに fgets() の使用も検討する必要があります。

あなたはfgets()に興味がある私を読みたいかもしれません:

scanf()とfgets()の違い

7
Gigi
  • char *pointers;はポインタ変数を作成します。
  • pointersaddressが指すpointersであり、デフォルトでは不確定です。
  • *pointerspointersが指すアドレス内のデータであり、アドレスが割り当てられるまで実行できません。

ただこれをしてください。

char arrays[12];
char *pointers;
pointers = arrays;
scanf("%s",pointers);
4
ATOzTOA

pointersは、int x; printf("%d\n", x);のように、初期化なしで使用されています。使用する前にポインタを何かに向ける必要があります。あなたはどの本を読んでいますか?

2
autistic

pointersは、単一化されたポインターです。あなたはそれに書き込むことができません。 arraysで行ったように、文字列を格納するのに十分なメモリを割り当てる必要があります。ポインターを使用すると、動的割り当てを使用できます(mallocを参照)。

1
md5

エラーについて詳しく教えてもらえますか?私は今コンパイラの周りにいません。

しかし、scanfとprintfが機能するためには、これをプログラムの先頭に置く必要があります。

#include <stdio.h>
#include <stdlib.h>

どちらもCの標準ライブラリです。IOにはscanfが含まれています。printfが同じであることは確かです。しかし、どのライブラリにどのライブラリが必要かがわかるまでは、両方を含めることで害はありません。すべてのプログラムの標準ライブラリ。すべてのファイルに大量の#includeを必要としないように、カスタムヘッダーファイルも使用するようにしてください。

メモリ割り当てのためのmallocステートメントを忘れないでください。

しかし、あなたが自分のコードで何をしようとしているのかよくわかりません。詳しく説明してください。

1
thepratt