我写了一个函数,它接受一个字符串并简单地对字符串进行编码(如果你愿意,压缩)这个格式的字符串:input = aassda,output = 2a2s1d1a。我的问题是如果我输入一个47个字符或更长的字符串,我会遇到一个seg错误。我附上了下面的功能。我大约一周前开始做C,所以请耐心等待我= /
编辑:任何改进建议都会很好。我知道我可以使代码更高效但是来自python的小背景我决定以最直接的方式做到这一点。
答案 0 :(得分:2)
string
只是一个垃圾指针。它永远不会被设置,它永远不会与任何内存相关联。您需要为malloc()
string
一些内存(当您完成时不要忘记free()
!),或者您需要将其设为数组。也就是说,你的两个选择是:
使用malloc()
/ free()
:
int main()
{
char* string = malloc(51); // Room for 51 chars (50 letters and 1 null terminating character)
printf("Please input a string of at most 50 chars: ");
scanf("%s", string);
lame_function(string);
free(string);
}
使用数组:
int main()
{
char string[51]; // Room for 51 chars (50 letters and 1 null terminating character)
printf("Please input a string of at most 50 chars: ");
scanf("%s", string);
lame_function(string);
}
答案 1 :(得分:0)
缓冲区溢出仍然存在。
请查看以下两个代码段。
char* string = malloc(51);
char string[51];
这两个语句足以为50个字符分配空间。 scanf()怎么样?
scanf("%s", string);
这会确保用户最多只能输入50个字符吗?没有永不。如果用户输入超过50个字符会发生什么? 。所以你应该用一些方法来防止溢出。为此,您可以在循环中使用 getc()函数。下面使用 fgets()。
描述另一种简单的方法fgets(str, 50, stdin);
i = strlen(str)-1;
if( str[ i ] == '\n')
str[i] = '\0';
fgets()最多可读取50个字符,或者当用户按下输入按钮时,从键盘的stdin读取。如果最后一个字符是'\ n',那么使用'\ 0'将其设为字符串的结尾。现在溢出问题已完全修复。