在c中写入控制台的char指针

时间:2013-03-15 05:49:01

标签: c string pointers char

我尝试将一个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;
}

&#34; Hello&#34;后出现问题。名称(* p)未写入。 我找不到任何错误,但输出不是我想要的。

5 个答案:

答案 0 :(得分: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;
}

编辑:添加指针强制转换

答案 1 :(得分:1)

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

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

答案 2 :(得分: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);

答案 3 :(得分:0)

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

答案 4 :(得分: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;
}