如何限制用户输入字符串的大小或动态分配内存

时间:2014-12-22 21:06:28

标签: c string user-input dynamic-memory-allocation

所以我有这段代码:

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
}
  1. 问题: 问题是我想限制用户想要输入的字符数为20.当然我可以为word []保留更多内存但是如果我超过一定数量,程序将再次崩溃。你如何在C中解决这个问题?

  2. 问题: 有没有什么办法可以在用户输入后为字符串分配所需的内存。例如,如果用户输入长度为999的字符串,我可以分配sizeof(字符串)* strlen(字)+ 1字节的内存吗?

  3. 注意:如果strlen()超出了某个限制,我想提示用户再次输入一个新字符串。

5 个答案:

答案 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 *'。