C printf(“%s\n”)输出与printf(“%s”)不同

C printf(“%s\n”)输出与printf(“%s”)不同,c,arrays,char,printf,newline,C,Arrays,Char,Printf,Newline,这个程序应该从一个.txt文件中读取一行文本,并且只打印一个单独的.txt文件中的回文字 逻辑和输入/输出都按预期工作,但当我试图在每个单词后用新行分隔输出时,问题就出现了。以下是代码片段: while((c = fgetc(fin)) != EOF) { if (isalpha(c)) { word[i++] = tolower(c); } else { word[i] = '\0'; printf("%s", word); } 假设输入的句子是:

这个程序应该从一个.txt文件中读取一行文本,并且只打印一个单独的.txt文件中的回文字

逻辑和输入/输出都按预期工作,但当我试图在每个单词后用新行分隔输出时,问题就出现了。以下是代码片段:

while((c = fgetc(fin)) != EOF) {

  if (isalpha(c)) {
    word[i++] = tolower(c);
  }

  else {
    word[i] = '\0';
    printf("%s", word);
  }
假设输入的句子是:加里正在骑自行车,现在迈克尔也加入了他的行列。当每个单词后面没有新行时,输出的是预期的字母。但是当我使用

while((c = fgetc(fin)) != EOF) {

  if (isalpha(c)) {
    word[i++] = tolower(c);
  }

  else {
    word[i] = '\0';
    printf("%s\n", word); // new line after every word
 }
开始出现空白行

为什么自行车和自行车之间有一条空行?这通常在序列中有超过1个非字母字符时发生。如果给word分配的字符不正确,为什么printf%s word可以工作

谢谢你的反馈

注:我是计算机科学的一年级学生。

请看输入

 bike, and 
在这里,将导致第一次检查失败。因此,它落在else子句上,并打印一个新行

这是因为我将是0,单词[i]='\0';将导致空字符串。现在您正在打印%s\n该行将如预期的那样为空。

查看输入

 bike, and 
在这里,将导致第一次检查失败。因此,它落在else子句上,并打印一个新行

这是因为我将是0,单词[i]='\0';将导致空字符串。现在您正在打印%s\n该行将如预期的那样为空。

更改此选项:

else
{
    word[i] = '\0';
    printf("%s\n", word);
}
为此:

else if (i > 0)
{
    word[i] = '\0';
    printf("%s\n", word);
    i = 0;
}
要跳过两个或更多连续非字母字符的大小写。

请更改此选项:

else
{
    word[i] = '\0';
    printf("%s\n", word);
}
为此:

else if (i > 0)
{
    word[i] = '\0';
    printf("%s\n", word);
    i = 0;
}

为了跳过2个或更多连续非字母字符的大小写。

您的程序将每个非字母字符视为单词分隔符。如果您的输入字符串中有几个相应的分隔符,那么您编写的程序将假定它们之间有空的零长度字。当您在每个单词后面加上\n时,这些空词在输出中看起来像额外的空行

这正是当您的程序发现输入字符串中的序列时发生的情况,即逗号后跟空格。和字符都是非字母字符。它们都是分隔符,这意味着您的程序实际上将其视为分隔符。这个空单词是输出中额外的空行

如果修改输入字符串以包含一个,,,,序列,则会看到这些逗号之间的每个空单词都有一个额外的空行

只有在每次输出后添加了\n字符,这些空行才可见。如果删除该选项,\n程序仍将查找并打印空字,但由于它们的长度为零,因此它们将不可见。或者,您可以简单地从输出中过滤掉零长度的单词


如果你不想让你的程序以这种方式运行,你必须重写你的代码,记住分隔符可以分组出现。在开始积累下一个单词之前,必须跳过整个连续组。或者,您可以从输出中筛选出长度为零的单词。

您的程序将每个单独的非字母字符视为单词分隔符。如果您的输入字符串中有几个相应的分隔符,那么您编写的程序将假定它们之间有空的零长度字。当您在每个单词后面加上\n时,这些空词在输出中看起来像额外的空行

这正是当您的程序发现输入字符串中的序列时发生的情况,即逗号后跟空格。和字符都是非字母字符。它们都是分隔符,这意味着您的程序实际上将其视为分隔符。这个空单词是输出中额外的空行

如果修改输入字符串以包含一个,,,,序列,则会看到这些逗号之间的每个空单词都有一个额外的空行

只有在每次输出后添加了\n字符,这些空行才可见。如果删除该选项,\n程序仍将查找并打印空字,但由于它们的长度为零,因此它们将不可见。或者,您可以简单地从输出中过滤掉零长度的单词


如果你不想让你的程序以这种方式运行,你必须重写你的代码,记住分隔符可以分组出现。在开始积累下一个单词之前,必须跳过整个连续组。或者,您可以从输出中过滤掉长度为零的单词。

不清楚您在问什么。请贴一个。你有一个逗号和一个空格,它们都不是自行车和之间的字母,这就是为什么@barakmanos这在我看来像是一个答案。@iharob:我同意,但是当我写一个关于如何解决问题的答案时,有人已经提到了它,所以如果我现在把它添加到我的答案中,那么它看起来就像是我偷了它,尽管我的评论是事先发布的。不清楚你说了什么
我在问。请贴一个。你有一个逗号和一个空格,它们都不是自行车和之间的字母,这就是为什么@barakmanos这在我看来像是一个答案。@iharob:我同意,但当我写关于如何解决问题的答案时,有人已经提到了,因此,如果我现在将它添加到我的答案中,那么看起来就像是我偷了它,尽管我的评论是事先发布的。如果他需要空格,他应该向isspacechar c查询,因为isalpha“”返回0。他必须使用的函数可能是isprintchar c?哦,我明白了。谢谢你,这让我明白了错在哪里。@StefanRendevski很高兴你知道了你的错误。祝您的计算机科学之旅一切顺利。如果他需要空间,他应该向isspacechar c查询,因为isalpha“”返回0。他必须使用的函数可能是isprintchar c?哦,我明白了。谢谢你,这让我明白了错在哪里。@StefanRendevski很高兴你知道了你的错误。祝你在计算机科学之旅中一切顺利。