2015-08-15 79 views
0

内存分配错误我有这个简单的代码,并不能弄清楚如何为scanf函数与scanf函数

char* string= (char*) malloc (sizeof(char)); 
printf("insert string: \n"); 
scanf("%s", string); 
free(string); 

不要紧,我的字符串有多少个字符是分配内存,这是一个错误。我想使用malloc作为char *,以任何方式为scanf设置内存。

+3

你只给字符串分配1个字节。足够的字符串终结符'\ 0'为空字符串,但没有别的。 –

+0

你是什么意思“这是一个错误”? *什么*错误?你如何分配多个角色?顺便说一句,'sizeof(char)'被指定为总是导致“1”。 –

回答

1

你只是要求1个字节。你需要比,如果你想存储的不仅仅是字符串中的0终止更多分配更多:

char* string= malloc (256); //256 bytes, arbitrary value... 

我删除:

  • sizeof(char),因为它总是保证是1
  • (char*)因为铸造返回值为malloc() is needless

我也推荐使用fgets()而不是scanf()来防止溢出缓冲区。通过在格式字符串中指定长度,可以通过scanf()完成相同的操作。但我个人更喜欢使用fgets(),如果有必要,使用sscanf()解析。

+0

也应该使用'%255s'作为格式字符串 –

0

尝试

char buf[256]; 
    scanf("%s" , buf); 

删除您的malloc。 你正在分配一小段内存给可能是一个可变大小的字符串数组。默认情况下,一个数组只是一个指向buf [0]的指针,这是字符串会给它的。您需要一个缓冲区来捕获最初的读取,然后分配适当的内存。

之后,你可以做字符串长度=(BUF)*的sizeof(char)的< - 伪

指定字符串的正确长度。

0

As @Blue Moon正确地指出,你只是分配内存来存储一个字符,并且单个字符可以存储的唯一字符串是空字符串或没有字符的字符串。在C中,所有字符串都是空终止的,并且您分配的内存的1个字节只能容纳空字符,即'\ 0'

为了在字符串中存储更多的字符,比如说一百个字符,可以做到以下几点:

#define MAX_STRING_SIZE 102 

char* string= (char*) malloc (sizeof(char) * MAX_STRING_SIZE); 
memset(string, '\0', MAX_STRING_SIZE); 
printf("Insert string: \n"); 
scanf("%101s", string); 
if (strlen(string) == (MAX_STRING_SIZE - 1)) 
{ 
    printf("The user entered a string larger than 100 characters!"); 
    free(string); 
    /****Error handling***/ 
} 

/*****Do something with string****/ 
free(string) 

上面的代码是一个不错的小把戏,以找出是否用户输入的字符或不是一个有效的数字。如果您希望用户输入最多100个字符,并且您的程序始终在理想情况下运行(用户一直监听并且永远不会输入超过100个字符),您只需要一个额外的字节来存储空值字符。因此,你需要101个字符的空间。但是,您可以为其他字符添加空间,并分配102个字节,以查找用户输入超过100个字符的字符串时的情况。

工作原理:假设用户输入100多个字符。 scanf函数最多可以读取101个字符。因此,我们可以使用strlen函数来检查用户输入的字符数是否等于101,这将有助于我们验证输入字符串。

+0

您的意思是'%101s'。此外,如果EOF发生,检查scanf返回值或初始化字符串将会很好 –

+0

@Matt McNabb:%101s宽度说明符将限制可以读取的字符数为101.我已经使用另一个空间保留空字符(第102位),以便strlen可以在保存的字符串上成功运行(因为strlen搜索空字符)。我已经添加了memset以将所有字符值设置为'\ 0'以使答案更完整:) –

+0

在我给了片段另外一个外观之后,我意识到calloc可以用来在一个步骤中完成malloc + memset。它会使它看起来更整洁;) –