无法从字符串中删除尾随换行符

时间:2014-10-21 04:49:58

标签: c newline

我无法从多行字符串中删除尾部\ n然后转换为令牌以列出表格。该字符串来自使用输入重定向(< input.txt)的文本文件。这就是我到目前为止所做的:

文本文件是:

Little Boy Blue, Come blow your horn, The sheep's in the meadow, The
cow's in the corn; Where is that boy Who looks after the sheep? Under
the haystack Fast asleep. Will you wake him? Oh no, not I, For if I do
He will surely cry.

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    int c;
    char *line;
    char *ptr;
    char *pch;
    line = (char *) malloc(1);
    ptr = line;
    for (;( *line = c = tolower(getchar())) != EOF; line++);

    *line='\0';

    pch = strtok(ptr," \n,.-");
    while (pch != NULL) 
    {
        printf ("%s\n", pch);
        pch = strtok(NULL, " ?;,.-");
    }
    return 0;      
}

1 个答案:

答案 0 :(得分:3)

你有重大的内存分配问题;你分配一个字节的内存,然后尝试读入大量的字符,并在最后添加一个空字节。你需要解决这个问题。

您的代码也有点令人费解,因为分隔符会在两次调用strtok()之间发生变化。这是允许的,但是不清楚为什么你不在第二个中包含换行符,在第一个中包含问号和分号(以及感叹号和冒号呢?)。

请注意,tolower()中声明了<ctype.h>

最后消除换行符的最简单方法是用空字节覆盖它。如果您还需要映射其他换行符,请在读取数据时进行转换。

#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    int c;
    char *line = (char *)malloc(1);
    size_t l_max = 1;
    char *ptr = line;

    if (line == 0)
        return 1;  // Report out of memory?

    while ((c = tolower(getchar())) != EOF)
    {
        if (ptr == line + l_max - 1)
        {
            char *extra = realloc(line, 2 * l_max);
            if (extra == 0)
                return 1;  // Report out of memory?
            l_max *= 2;
            line = extra;
        }
        *ptr++ = c;
    }

    if (*(ptr - 1) == '\n')
        ptr--;
    *ptr = '\0';

    static const char markers[] = " \n\t,.;:?!-";
    char *pch = strtok(line, markers);

    while (pch != NULL) 
    {
        printf ("%s\n", pch);
        pch = strtok(NULL, markers);
    }
    return 0;      
}

您也可以将换行符留在数据中; strtok()最终会跳过它。