我无法从多行字符串中删除尾部\ 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;
}
答案 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()
最终会跳过它。