决定用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);
}