C 获取未知大小的输入字符串,当字符串上没有非字母数字字符时,如何停止获取输入?

C 获取未知大小的输入字符串,当字符串上没有非字母数字字符时,如何停止获取输入?,c,string,validation,malloc,user-input,C,String,Validation,Malloc,User Input,您好,我正在学习C语言,我正在使用DMA,我正在尝试创建一个程序,从用户那里获取输入字符串,但我们不知道最大大小(我想在堆上分配内存)。我正在尝试做的另一件事是,字符串只能有字母数字字符,或者,当用户输入的字符串中有逗号或点时,可能会停止输入(这可能吗?) 如果你们能给我建议一个实现这一目标的方法,或者给我指出正确的方向,我将不胜感激 提前感谢为了实现您的目标,您应该使用getc()或getchar()从输入流中一次读取一个字节,并将其存储到目标数组(如果是字母数字),使用中的isalnum()

您好,我正在学习C语言,我正在使用DMA,我正在尝试创建一个程序,从用户那里获取输入字符串,但我们不知道最大大小(我想在堆上分配内存)。我正在尝试做的另一件事是,字符串只能有字母数字字符,或者,当用户输入的字符串中有逗号或点时,可能会停止输入(这可能吗?)

如果你们能给我建议一个实现这一目标的方法,或者给我指出正确的方向,我将不胜感激


提前感谢

为了实现您的目标,您应该使用
getc()
getchar()
从输入流中一次读取一个字节,并将其存储到目标数组(如果是字母数字),使用
中的
isalnum()
进行测试,根据需要使用
realloc()重新分配数组
并在
EOF
和任何其他分隔符上停止,可能会使用
ungect()将该字节推回到输入流中。使用
int
变量存储
getc()
的结果,以便正确检测文件结尾。不要忘记使用null终止目标数组并将其返回给调用者,或者在文件末尾使用
null

您可以查看类似用途的示例

请注意,如果您知道输入大小的合理限制,可以使用
scanf()

还请注意,GNU系统有一个扩展,允许
scanf
将目标阵列分配到适当的大小,仅受可用内存的限制:

char *str;
if (scanf(" %m[0-9a-zA-Z]", &str) == 1) {
    // handle the user input
    handle(str);
    // free the allocated string
    free(str);
    // read and discard the separator(s)
    scanf("%*[^0-9a-zA-Z]");
} else {
    // no pending word: either end of file or a non alphanumeric character pending
}

首先,如果您寻求帮助,您需要在此处显示代码。但作为一个简短的指导,您需要动态地为数组分配内存(),然后循环数组,查看包含它的每个字符是否为
isalnum()
-这需要
ctype.h
库。请,阅读并发布。@JeanBook:点击分数下面的灰色复选标记,你可以投票并接受这个答案。
char *str;
if (scanf(" %m[0-9a-zA-Z]", &str) == 1) {
    // handle the user input
    handle(str);
    // free the allocated string
    free(str);
    // read and discard the separator(s)
    scanf("%*[^0-9a-zA-Z]");
} else {
    // no pending word: either end of file or a non alphanumeric character pending
}