如何加载可以包含“新行”的文本?

时间:2015-08-19 22:52:12

标签: c

我教师考试中常见的一个练习是使用一个函数将文本(<1000个字符)加载到一个数组中,该数组可以包含“enter”或“\ n”。

我见过其他人这样做的方法如下:

char * load (int  *characters) //characters=amount of characters written
{    
    static char *text;
    *characters=0;
    while((*characters<999) && (((text[*characters]) = getchar()) != EOF))
    {
        ++*characters;
    }
    text[*characters]='\0';
    return(text);
}

我的问题是,在尝试输入内容时,我总是会遇到分段违规。我很乐意帮忙!

3 个答案:

答案 0 :(得分:2)

通过textmalloc分配一些内存。如,

char *text = malloc(1000);

请记住使用free在函数末尾释放内存。

<强> UPD: 或者,您可以考虑使用堆栈而不是堆:

static char text[1000];

请注意,在这两种情况下,您应该为字符串分配最大长度加一个字节,因为最后是'\0'

答案 1 :(得分:0)

无需为字符传递int指针。你的整个阵列概念似乎也很完美。有关使用char数组的方法,请参阅here。你只声明了一个char指针,但你永远不会将它指向一个内存块,这意味着一旦你开始遍历你,上帝知道在哪里并且会违反分段。

  1. 在堆栈上声明一个数组或保留动态内存并指定一个指向该块的指针
  2. 循环,而getchar()不等于\ n或EOF(您也可以使用Enter代码的ASCII代码,如果我没记错的话,这是数字13)。另外,根据您声明数组的方式,您必须为当前正在处理的数组单元格的索引放置一个计数器,或者只将指针增加一个
  3. 在数组中插入从getchar()接收的字符
  4. 这是一个更容易关注的tutorial,它可以帮助你掌握指针/数组的情况。

答案 2 :(得分:0)

指针不是数组。

所以

static char *text;

定义一个指针,因为它是static是一个NULL指针。下一个操作是尝试将该指针视为数组,

while((*characters<999)&&(((text[*characters])=getchar())!=EOF))

给出了未定义的行为。实际上,结果通常是覆盖一些随机的内存区域。操作系统 - 如果他们检测到 - 将终止您的程序(在您的情况下,这意味着触发分段违规)。

使text静态无关紧要。如果没有static关键字,那么所有发生的事情都是text在程序运行时自动创建,并且在返回后不存在。在这种情况下,它将是uninitiatialised(这意味着即使访问它的值也会给出未定义的行为)。

您需要做的是将text指向内存中的有效位置。由于您返回其值,因此该值必须在函数返回后有效。一种方法是

 char text = malloc(999 + 1);
只要输入不超过999个字符,

就可以了。调用者还必须释放该内存以避免内存泄漏。

此外,getchar()会返回intint可以代表EOF的值。无法保证char可以。因此,分配(text[*characters])=getchar()意味着该值(因为它已被转换为char)可能永远不会与EOF相等。