在给出长度为48或更高的字符串时获取段错误

时间:2013-01-22 05:06:08

标签: c

我写了一个函数,它接受一个字符串并简单地对字符串进行编码(如果你愿意,压缩)这个格式的字符串:input = aassda,output = 2a2s1d1a。我的问题是如果我输入一个47个字符或更长的字符串,我会遇到一个seg错误。我附上了下面的功能。我大约一周前开始做C,所以请耐心等待我= /

编辑:任何改进建议都会很好。我知道我可以使代码更高效但是来自python的小背景我决定以最直接的方式做到这一点。

2 个答案:

答案 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'将其设为字符串的结尾。现在溢出问题已完全修复。