我无法打印字符串。需要一些关于我做错的帮助以及对这些案例中最佳方法的一些见解。
#include<stdio.h>
#include<string.h>
void getName(char *name);
int main()
{
char name[256];
getName(name);
printf("Name = %s\n", name);
return 0;
}
void getName(char *name)
{
char line[256];
printf("Please enter your name! \n");
gets(line);
name = (char *) malloc(strlen(line));
strcpy(name, line);
}
答案 0 :(得分:3)
你不需要这样做,注释掉它:
name = (char *) malloc(strlen(line));
您已经传入name
的缓冲区。您不需要分配第二个缓冲区。
另外,你没有在分配中添加1来解释null终止符,但这无论如何都不相关,因为无论如何都不需要分配。
你可以gets
直接进入name
并切断line
中间人,事实上。
答案 1 :(得分:3)
你有过于复杂的getname()
- 它只需要:
void getName(char *name)
{
printf("Please enter your name! \n");
gets(name);
}
请注意,gets被广泛认为是unsafe function to use,您应该尝试养成使用fgets的习惯。
答案 2 :(得分:3)
我做错了什么
其他人已经指出一些的错误,但是还没有人展示正确的解决方案。
您的代码本质上容易受到缓冲区溢出的影响。 gets()
函数不允许您指定缓冲区大小,因此如果输入的字符数超过256个,则会写出数组的边界。那很糟糕。
你应该做的是
fgets()
:#include <stdio.h>
int main()
{
char name[256];
fgets(name, sizeof name, stdin);
printf("Name = %s\n", name);
return 0;
}
另外,如果您考虑过动态内存分配:
检查malloc()
。
您仍然想要跟踪缓冲区大小;这个函数怎么样?
#define NAME_LENGTH 256
char *getName(void)
{
char *buf = malloc(NAME_LENGTH);
if (buf == NULL) {
return NULL;
}
fgets(buf, NAME_LENGTH, stdin);
return buf;
}
但是,正如我在评论中提到的那样,在这种情况下,根本不需要动态内存分配。
答案 3 :(得分:0)
我知道指针对于初学者来说可能很复杂。所以,忘记指针。您希望以下代码如何运行?
void change(int a)
{
a = 10;
}
int main()
{
int a = 20;
change (a);
printf("%d", a); // It prints 20
}
(如果您确实理解了上述代码,请继续阅读。否则,请阅读变量的函数和范围。)
您的代码具有基本相同的结构,只有而不是int a,您有一个char *名称。请注意,此处有两个不同的名称标识符。一个是getName的参数,另一个是main中定义的常量指针(数组标识符)。更改参数的参数值不会更改调用者参数的值。