1

重複の可能性:
動的文字列入力
-Cでポインターが機能しないscanf( "%as")strcmpを使用

次は良いコードと見なされますか?どこかでmallocを使うべきではなかったのですか?私はこれをコンパイルすることができ、それは機能しましたが、そうではないはずだと感じています。

#include <stdio.h>

int main (void) {

    char *name;

    printf("Whats your name? ");
    scanf("%s", &name);
    printf("\nyour name is %s", &name);

    return 0;
}

名前を変更したい場合はどうなりますか?どうすればいいですか?

編集:私は本当にポインターを使用してこれを行うための最も効率的で正しい方法を探しています。mallocが必要だと思います。

4

2 に答える 2

6

nameはポインターであり&name、変数のアドレスを返すnameため、scanfは入力した名前をポインター自体に入れています。

たとえば、次のように入力するABCと、ポインターは 0x00434241 (CPU がリトル エンディアンの場合) または 0x41434200 (CPU がビッグ エンディアンの場合) になります。ここで、0x41 は「A」の文字コード、0x42 は「A」の文字コードです。 「B」など

入力した名前を格納できるメモリを割り当ててから、そのポインタを に渡す必要がありますscanf

スタックに割り当てる例を次に示します。

#include <stdio.h>

#define MAX_NAME_LENGTH 256

int main (void) {

    char name[MAX_NAME_LENGTH];

    printf("Whats your name? ");
    scanf("%s", name);
    printf("\nyour name is %s", name);

    return 0;
}
于 2012-11-06T23:51:27.083 に答える
-1

または、gets を使用して、2 つ以上の順次入力がある場合に標準入力バッファーを回避することもできます。

#include <stdio.h>

#define LENGTH 256

int main (void) {

   char name[LENGTH];

   printf( "Whats your name? " );
   fgets( name, sizeof( name ), stdin );
   printf( "\nYour name is %s", name );

   return 0;
}
于 2012-11-06T23:56:19.343 に答える