1

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

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

4

2 回答 2

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);
}
于 2013-01-22T05:19:03.460 回答
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 个字符或当用户按下回车按钮时,从键盘的标准输入。如果最后一个字符是 '\n',则使用 '\0' 将其作为字符串的结尾。现在溢出问题已经完全解决了。

于 2013-01-22T07:07:34.143 回答