这是一个相当重要的问题,请花些时间仔细阅读并提供答案。
我的问题是,在C中如何以字符串形式输入?通常我们要求用户提供字符数,比如说n,并且我们可以简单地声明char str[n]。这会很好。
但是,当我们通常像char str[100]这样声明大小时,如果我们提供一个长度为20的字符串,则会浪费80个字节,我们通常不希望出现这种情况,这样声明是否可以?
如果用户输入了120个字符,那么只有100个字符将存储在我们的字符数组中,我们也不希望出现这种情况。
所以,基本上我们不知道用户可能输入什么。他输入一个长度,由他自己选择。
在上述情况下,我们使用scanf或gets进行输入,例如scanf("%s",str)、scanf("%[^\n]%*c",str)、scanf("%[^\n]s",str)、gets(str)等。
当我们使用scanf时,当我们输入一个长度为5的字符串并给出6个字符时,第6个字符将无法存储。
当我们使用puts时,当我们输入一个长度为5的字符串并给出6个字符时,第6个字符将存储在连续的字节中,但是当我们尝试打印时,第6个字符将无法显示。当我们输入6个字符时,它会显示“stack smashing detected”的消息。我们不知道其他数据是否存在,可能会被覆盖。
上述情况是正确还是错误的,请帮助我吗?
现在,有另一种方式声明字符串并将其作为字符串输入,我们可以使用指针,比如我们可以动态分配内存,然后在完成字符串工作时释放内存。我们使用malloc、calloc、realloc来分配内存,并使用free来释放内存。
我们可以声明char* str=(char*)malloc(size*sizeof(char)),并且我们以scanf("%[^\n]s",str)的形式输入。但是,这里我们也需要提供大小。如果我们不知道大小怎么办?如果用户提供的输入大于大小怎么办?
我们还可以声明char* str=(char*)malloc(sizeof(char))。在这里,当我们输入一个长度为5的字符串时。字符串以连续的字节存储在堆中,但我们只分配了1个字节,我们输入的剩余4个字节以一种非法的内存访问方式存储,我们可以这样做吗?
上述提到的两种情况是相同的,这是正确的还是错误的?您能帮我吗?
我处于“奇步逼和”的情况中(象棋术语)。您能帮我吗?有哪些方式可以声明字符串并输入而不指定大小?我们能否在不指定大小的情况下动态分配内存?有哪些声明字符串的方式?
char buf[4096]
。然后,接受输入到buf
中,随后使用strlen(buf)
获取该值并动态分配实际的字符串空间。 - PHD