1

好的。所以我正在读取文本文件中的文本并将其存储到 char 数组中,这是按预期工作的。但是,文本文件包含许多换行符转义序列。那么问题是,当我打印出带有存储文本的字符串数组时,它会忽略这些换行符序列并简单地将它们打印为“\n”。

这是我的代码:

char *strings[100];

void readAndStore(FILE *file) {
  int count = 0;
  char buffer[250];

  while(!feof(file)) {
    char *readLine = fgets(buffer, sizeof(buffer), file);
    if(readLine) {
      strings[count] = malloc(sizeof(buffer));
      strcpy(strings[count], buffer);
      ++count;
    }

  }
}

int main() {

  FILE *file1 = fopen("txts", "r");
  readAndStore(&*file1);
  printf("%s\n", strings[0]);
  printf("%s\n", strings[1]);
  return 0;
}

输出变成这样:

这里有很多文本 \n 更多文本应该在新行上,但不是 \n 等等

有没有办法让它将“\n”读取为实际的换行符转义序列,或者我只需要将它们从我的文本文件中删除并找出其他方法来分隔我的文本?

4

2 回答 2

5

不。事实是,这\n是您的编译器的特殊转义序列,它将其转换为单个字符文字,即“LF”(换行,返回),具有 ASCII 代码0x0A。因此,是编译器赋予了该序列特殊的含义。

相反,当从文件读取时,\n被读取为两个不同的字符,ASCII 码0x5c,0x6e

您将需要编写一个例程,将所有出现的\\n(由字符 \ 和 n 组成的字符串,双转义是必要的,以告诉编译器不要将其解释为转义序列)与\n(单转义序列,表示换行)。

于 2013-10-13T10:11:10.870 回答
2

如果您只打算用实际字符替换 '\n',请使用自定义替换功能,例如

void replacenewlines(char * str)
{
   while(*str)
   {
      if (*str == '\\' && *(str+1) == 'n') //found \n in the string. Warning, \\n will be replaced also.
      {
         *str = '\n'; //this is one character to replace two characters
         memmove(str, str+1, strlen(str)); //So we need to move the rest of the string leftwards
               //Note memmove instead of memcpy/strcpy. Note that '\0' will be moved as well
      }
      ++str;
   }
}

这段代码没有经过测试,但大体思路一定要清楚。这不是替换字符串的唯一方法,您可以使用自己的方法或找到其他解决方案。

如果您打算替换所有特殊字符,最好查找一些现有的实现或清理字符串并将其作为format参数传递给printf. 作为最低要求,您需要复制字符串中的所有 '%' 符号。

不要字符串作为原样的第一个参数传递printf,这会导致各种有趣的事情。

于 2013-10-13T10:24:07.923 回答