所以我有这段代码:
void main()
{
char word[21]={0}; // changed from 20 to 21 because of '\0'.
// do {
scanf("%s", &word);
// } while (strlen(niz)>20); this line is useless because program crashes anyway
}
问题: 问题是我想限制用户想要输入的字符数为20.当然我可以为word []保留更多内存但是如果我超过一定数量,程序将再次崩溃。你如何在C中解决这个问题?
问题: 有没有什么办法可以在用户输入后为字符串分配所需的内存。例如,如果用户输入长度为999的字符串,我可以分配sizeof(字符串)* strlen(字)+ 1字节的内存吗?
注意:如果strlen()超出了某个限制,我想提示用户再次输入一个新字符串。
答案 0 :(得分:2)
您可以使用fgets
:
fgets(word, sizeof(word), stdin);
第二部分:
不幸的是,在C中你不能分配输入字符串所需的确切内存量。原因是在为它分配内存之前需要知道字符串的长度,为此必须将该字符串存储在缓冲区中。
如果要输入任意大小的字符串并同时保存内存,请使用realloc
。
测试程序:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *s = malloc(1);
printf("Enter a string: \t"); // It can be of any length
int c;
int i = 0;
do
{
c = getchar();
s[i++] = c;
s = realloc(s, i+1);
}while(c != '\n' && c != EOF);
s[i] = '\0';
printf("Entered string: \t%s", s);
return 0;
}
答案 1 :(得分:1)
某些版本的scanf
支持m
修饰符。例如,在glibc> = 2.7中。他们为用户分配必要的缓冲区:
char *p;
int n = scanf("%ms", &p);
if (n == 1) {
printf("read: %s\n", p);
free(p);
} else {
// error
}
还有较旧的a
修饰符也是如此。
答案 2 :(得分:0)
在%s中将字符常量放在s前面:
scanf("%20s", &word);
你的第二个问题:简而言之。你需要内存空间来接受输入。但是,减少分配的常见解决方案是:
char tmp[1000];
char *strptr;
scanf("%s", &temp);
strptr = malloc(sizeof(char)*(strlen(tmp)+1));
但如果你多次调用此函数,那只能节省空间。
答案 3 :(得分:0)
您可以使用fgets限制输入。
fgets(word, sizeof(word), stdin);
如果以后需要使用sscanf
答案 4 :(得分:0)
使用命令行参数.. main(int argc,char * argv [])
这里argc会告诉你在提供可执行文件时会传递多少个参数。
argv将为您提供数据或字符串..只需将其提供给'char *'。