决定用C语言的自制函数试试我的手
我试图创建一个获取字符串的函数。我成功地创建了一个名为决定用C语言的自制函数试试我的手,c,C,我试图创建一个获取字符串的函数。我成功地创建了一个名为mult()的函数,它将数字相乘。您可以在此处找到我的代码: #include <stdio.h> #include <stdlib.h> #define MAX_NAME_SIZE char *GetString(void); int main (void) { char *a; printf("give me your name please\n"); a = GetString();
mult()
的函数,它将数字相乘。您可以在此处找到我的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME_SIZE
char *GetString(void);
int main (void)
{
char *a;
printf("give me your name please\n");
a = GetString();
printf("Why hello their, %s", a);
}
char *GetString(void)
{
char x;
fgets(x, MAX_NAME_SIZE, stdin);
}
已解决。
我通过改变char x解决了这个问题;对于char*x和GetString返回x,我还向MAX_NAME_size添加了一个大小。您的宏定义是错误的;试一试
#define MAX_NAME_SIZE 1024
(或者其他数字,可能是128)
您应该使用
gcc-Wall-gstring.c-ostring
进行编译;顺便说一句,您可以使用gcc-C-E string.C
获取预处理器输出。您必须为x
分配内存,然后将其地址(类型char*
)传递给fgets
。比如:
char* getString(void)
{
char* s = malloc(MAX_NAME_SIZE);
if ((s = fgets(s, MAX_NAME_SIZE, stdin)) == NULL)
{
free(s);
}
return s;
}
调用者现在必须free()
在getString()
中分配的内存
或者,您可以传入字符串:
char* getString(char* s, size_t size)
{
return fgets(s, size, stdin);
}
我想说的是,这里几乎没有理由使用
getString()
函数。错误消息相当清楚-您正在传递一个char,而您应该在其中传递一个char*。您可以只传递&c,这将修复编译器错误,但这是一个非常糟糕的主意,因为您可能希望名称长度超过一个字符。现在已经有足够的提示了…您有很多bug。你定义一个常数,但不给它任何值。然后,将该无值常量传递给期望有值的对象。您有char*a
来接受GetString数据,但在GetString中您只有char x
。然后,GetString也不会返回任何内容,因此您的fgets()调用完全没有意义。另一方面,您需要一个数组来存储输入的字符串。“我通过将char x;
更改为char*x
”来解决这个问题-等待下一个问题,他会问为什么它有时会崩溃fgets(s,size,stream)
从流中最多读取一个小于大小的字符,因此,不需要使用size-1
或分配MAX\u NAME\u size+1
。
char* getString(char* s, size_t size)
{
return fgets(s, size, stdin);
}