-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()
{
    char N[20];
    printf("Type your name (max 20 char): "); 
    scanf("%s", N); 
    return N;
}

一旦这个函数返回,N就不再存在(它是一个局部变量)。所以你正在返回一个指向不存在的东西的指针。

于 2013-03-15T05:51:56.710 回答
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 回答
0

返回的值G()是堆栈本地地址。它只存在于该函数的范围内。当执行返回到 main 时,它指向程序堆栈上大多数不再包含该字符串的位置。

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

先看看这是一个愚蠢的错误......

你不能返回一个局部变量地址......

将 char N[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 回答