C 使用'读取文本文件/n';

C 使用'读取文本文件/n';,c,string,printf,newline,C,String,Printf,Newline,好的。所以我从一个文本文件中读取文本并将其存储到一个字符数组中,这是按预期工作的。但是,文本文件包含许多换行符转义序列。然后,问题是,当我打印带有存储文本的字符串数组时,它会忽略这些换行符序列,而只是将它们打印为“\n” 这是我的密码: char *strings[100]; void readAndStore(FILE *file) { int count = 0; char buffer[250]; while(!feof(file)) { char *readLin

好的。所以我从一个文本文件中读取文本并将其存储到一个字符数组中,这是按预期工作的。但是,文本文件包含许多换行符转义序列。然后,问题是,当我打印带有存储文本的字符串数组时,它会忽略这些换行符序列,而只是将它们打印为“\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和 和上\n


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

没有。事实是,
\n
是编译器的一个特殊转义序列,它将它转换为一个单字符文本,即“LF”(换行,返回),具有ASCII码
0x0A
。所以,编译器赋予了这个序列特殊的意义

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


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

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

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


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

如果只想用实际字符替换“\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
的第一个参数,这会导致各种有趣的事情。

如果您只想用实际字符替换'\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
的第一个参数,这会导致各种有趣的事情。

除了神秘的全局之外,我们只能假设是一个
char*[]
ptr数组,您意识到,如果发生读取错误,您会盲目地增加
计数
,从而在过程中在字符串包中留下一个插槽,对吗?如果您的文本文件实际上包含一个反斜杠字符,后跟一个
n
(两个字符),不要指望
fgets
会神奇地为您翻译。不会。此外,您不检查
fopen
是否成功。如果它返回
NULL
(比如说因为文件不在那里),那么以后当您尝试使用
file1
时,您会有未定义的行为。只在文件中存储实际的换行,而不是转义序列,会更有意义。转义序列只对代码中的字符串有意义,编译器在其中转换它们。@WhozCraig,我没有意识到这一点,没有必要对它大惊小怪。@Baldrick Hallow以这种方式存储它可能有一个完全合理的原因。可能需要的是,无论使用何种机制,都不存在真正的新词,现在他只需要将它们变回原来的自己。我见过类似的。这并不常见,但肯定不是闻所未闻。除了神秘的全局,我们只能假设是一个
char*[]
ptr数组,您意识到在发生读取错误的情况下,您会盲目地增加
count
,从而在过程中在字符串包中留下一个插槽,对吗?如果您的文本文件实际上包含一个反斜杠字符,后跟一个
n
(两个字符),不要指望
fgets
会神奇地为您翻译。不会。此外,您不检查
fopen
是否成功。如果它返回
NULL
(比如说因为文件不在那里),那么以后当您尝试使用
file1
时,您会有未定义的行为。只在文件中存储实际的换行,而不是转义序列,会更有意义。转义序列只对代码中的字符串有意义,编译器在其中转换它们。@WhozCraig,我没有意识到这一点,没有必要对它大惊小怪。@Baldrick Hallow以这种方式存储它可能有一个完全合理的原因。可能需要的是,无论使用何种机制,都不存在真正的新词,现在他只需要将它们变回原来的自己。我见过类似的。不是