-2

char 配列を名前としてコンソールに書き込もうとしましたが、うまくいきません。ここにコードがあります

#include<stdio.h>
#include<string.h>

int F()
{
    int S;
    printf("Type your student number(10 digit):"); 
    scanf("%d", &S ); 
    return S;
}

char * G()
{
    char N[20];
    printf("Type your name (max 20 char): "); 
    scanf("%s", N); 
    return N;
}

int main()
{
    int num=F();
    char * p ;
    p=G();

    printf("Hello %s, your student id is %d ", p,num);



    printf("\n The address of 1st char is %x ",&p[0]);
    printf("\n The address of 20th char is %x ",&p[19]);
    printf("\n The address of int is %x ",&num);
    return 0;
}

「こんにちは」の後に問題があります。名前(*p)は書きません。間違いは見つかりませんが、出力は私が望むものではありません。

4

5 に答える 5

2
char * G(char N[20])
{
    printf("Type your name (max 20 char): "); 
    scanf("%19s", N); 
    return N;
}

int main()
{
    int num=F();
    char p[20];
    G(p);
    ...
    printf("\n The address of 1st char is %p ", (void*)p);
    printf("\n The address of 20th char is %p ", (void*)(p + 19));
    printf("\n The address of int is %p ", (void*)&num);
    return 0;
}

編集:ポインタキャストを追加

于 2013-03-15T05:55:22.103 に答える
1

与えられたとおりに静的宣言を行います。それが動作します

char * G()
{
    static char N[20];

    // char *N = (char *)malloc((sizeof(char)*20));

    printf("Type your name (max 20 char): ");
    scanf("%s", N);
    return N;
}

mallocを使用してメモリを割り当てることもできます。次に、使用後に割り当てられたメモリを解放する必要があります。ここで、すべてのパラメータを出力した後のコードで、メモリを解放できます。

free(p);
于 2013-03-15T06:01:31.577 に答える
1
char * G()
{
    char N[20];
    printf("Type your name (max 20 char): "); 
    scanf("%s", N); 
    return N;
}

この関数が戻ると、N存在しなくなります(ローカル変数です)。したがって、存在しないものへのポインタを返しています。

于 2013-03-15T05:51:56.710 に答える
0
char * G()
{
    char N[20];
    printf("Type your name (max 20 char): "); 
    scanf("%s", N); 
    return N;
}

最初にそれを愚かな間違いを調べてください...

ローカル変数アドレスを返すことはできません。

charN[20]をグローバルファーストとして定義します。

または、関数定義を次のように変更します。

void G(char *N)
{    
    printf("Type your name (max 20 char): "); 
    scanf("%s", N); 
}

int main()
{
    int num=F();

    char N[20];

    G(N);

    printf("Hello %s, your student id is %d ", N,num);
    return 0;
}
于 2013-03-15T05:55:12.820 に答える
0

によって返される値G()は、スタックローカルアドレスです。その関数のスコープ内にのみ存在します。実行がmainに戻ると、文字列がほとんど含まれていないプログラムスタック上の場所を指します。

于 2013-03-15T05:51:27.193 に答える