2016-07-29 5 views
1

ためのsscanfルーチンなぜsscanfは必要&Iがで引数について混乱しています%d個の整数のではなく、%sの文字列

#include <string.h> 
char sentence[20]; 
char first_name[7]; 
char last_name[7]; 
int age; 

strcpy(sentence, "aaaaaa bbbbbb 20"); 
sscanf(sentence, "%s %s %d", first_name, last_name, &age); 

がなぜそのchar配列が&は接頭辞が、整数の変数が行う必要はありませんか?

+3

配列名がベースアドレス – sinsuren

+0

への参照であるため、配列への配列が崩壊するので、既に動的割り当てを伴う文字列 –

+0

のアドレスを持つため、可変文は 'char * sentence = malloc(sizeof )* 20); 'おそらくそれは理解するのに役立つでしょう –

答えて

3

Cで文字列をいただき、ありがとうございます「\ 0」文字が続く文字列です。 Cでの配列の名前は、最初の要素のアドレスです。したがって、整数を格納する場合は、アドレスを渡すために '&'を追加する必要があります。

0

Cでは、配列の名前はベースアドレスを表します。
sscanf()には、変数値を格納できるメモリ位置を渡す必要があります。したがって、&address ofを意味し、プリミティブ型の場合はアドレスを取得するために使用されます。そのため、データ型がintの場合は&が使用されます。しかし、文字列は配列の後('\0')、nameはベースアドレスを提供します。

+2

これらはすべてポインタですが、同じデータ型ではありません:' arr'は与えられた型のx要素の配列へのポインタで、 '&arr'はポインタです、 '&arr [0]'は配列要素型の要素へのポインタです。 – naccyde

-1

Cでは、文字の配列の識別子は配列の最初の要素へのポインタとして減衰します。

sscanf()機能を使用すると、intタイプを渡すと、それに書き込むためにメモリ位置へのポインタを必要とする、あなたは、変数のアドレスを渡すために効果があるため&と変数名の前に付ける必要があります。このようにして、sscanfは変数のメモリ位置に直接書き込むことができます。コピーではなく、参照によって引数を渡しています。

アレイ名は配列の最初の要素へのポインタに減衰されるため、sscanfは既にメモリ位置にアクセスしているため、配列名の先頭には&を付ける必要はありません。

+2

いいえ、タイプが間違っています。配列名は配列全体の配列ではなく、配列*の最初の要素へのポインタになります(もちろん、元の値は同じです)。 – hyde

+0

@hyde:そうです、投稿は修正されました。私は最初の要素ではなく配列へのポインタを返す '&sentence'と混同しています。 – naccyde

0

&は、のアドレスがであることを示します。

sscanfは、与えられた文字列からの読み取り値をそれらのアドレスに格納することができるように変数のアドレスを期待しています。

Cの配列名は最初の配列要素のアドレスを参照しますが、変数の場合は変数のアドレスを指定する必要があります。

関連する問題