我在C中使用了这个函数,我在我的项目中使用它来读取输入中的字符:
char* readStringInp()
{
char* string=NULL,c=NULL;
int i=0;
string=(char *)malloc(sizeof(char)*LGTH_STRING_INPUT);
for(i=0;i<LGTH_STRING_INPUT && ( (c=getchar()) != '\n' && c != EOF );i++)
string[i]=c;
string[i]='\0';
return string;
}
LGTH_STRING_INPUT
是一个数值常量,表示可以读取的字符串的最大长度。
哪个是读取没有固定长度的字符串的最佳方法?
答案 0 :(得分:2)
这为20个字符分配内存。当使用18个字符时,realloc分配另外20个字符。随着字符串的增长,将分配20个字符的附加增量。如果realloc失败,则返回当前字符串。当找到换行符或EOF时,while循环终止 分配的内存应该由调用函数释放 EDIT添加了main()以显示释放已分配的内存
#include <stdio.h>
#include <stdlib.h>
char* readStringInp();
int main()
{
char *s=readStringInp();
if ( s != NULL)
{
printf ( "%s\n", s);
free ( s);
}
return 0;
}
char* readStringInp()
{
char* string=NULL, *temp = NULL;
int c=0, available=20, used=0, increment=20;
string=malloc(available);
if ( string == NULL)
{
printf ( "malloc failed\n");
return NULL;
}
while( (c=getchar()) != '\n' && c != EOF )
{
if ( used == available - 2)
{
available += increment;
temp = realloc ( string, available);
if ( temp == NULL)
{
printf ( "realloc failed\n");
return string;
}
string = temp;
}
string[used]=c;
used++;
string[used]='\0';
}
return string;
}
答案 1 :(得分:1)
读取没有固定长度的字符串的最佳方法是什么?
正如代码中已经完成的那样,使用malloc()
动态分配内存并继续读取字符,直到达到sentinel条件并继续增加使用realloc()
在同一指针上分配的内存,除非你有空间抓住所有角色。
答案 2 :(得分:0)
calloc() (您已使用)和 realloc() 的组合将用于动态调整缓冲区大小以适应不同长度的用户输入 但是, 现有 示例代码中有几个问题 应该在继续使用该组合之前解决:见下面的建议和评论:
如上所述,您现有的代码将泄漏内存,因为您从未调用free()。
此外,您将在string
中获得缓冲区溢出。 (见下面的解释)
这里有几个更正,允许您的示例代码工作:(见评论)
#define LGTH_STRING_INPUT 20
//have written function to accept argument, easier to free memory
char* readStringInp(char *string){
//char* string=NULL,c=NULL;//done in main
int c; //getchar() requires int to detect EOF (-1)
int i=0;
//string=malloc(LGTH_STRING_INPUT); //do not cast return value of calloc
// max length allow should be LGTH_STRING_INPUT - 1
// to allow room for NULL after loop
for(i=0;i<LGTH_STRING_INPUT-1 && ( (c=getchar()) != '\n' && c != EOF );i++)
{
string[i]=c;
}
string[i]='\0';
return string;
}
int main(void)
{
char *buf = {0};
char bufIn[LGTH_STRING_INPUT];
//allocated and free memory in calling function:
buf = malloc(LGTH_STRING_INPUT);
if(buf)//check return of malloc
{
sprintf(bufIn, "%s", readStringInp(buf)); //use return value in buffer
free (buf);//free memory that has been created
}
return 0;
}