我尝试将一个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)未写入。 我找不到任何错误,但输出不是我想要的。
答案 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;
}