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

时间:2014-12-16 16:28:38

标签: 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);
  }

让我们说输入的句子是:加里骑自行车,现在迈克尔加入了他。当每个单词后面没有换行时,输出就是预期的(仅限字母)。但是当我使用

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
 }

空行开始出现

为什么" bike"之间有一个空白行?和"和"?每当序列中有多个非字母字符时,通常会发生这种情况。如果将字符分配给" word"是不正确的,为什么" printf("%s", word)"工作

感谢您的反馈。

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

3 个答案:

答案 0 :(得分:2)

查看输入

 bike, and 

此处,将导致第一次检查失败。因此它落到else子句并打印一个新行。

这是因为i0word[i] = '\0';将导致空字符串。现在您正在打印"%s\n"该行将按预期显示为空白。

答案 1 :(得分:2)

改变这个:

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

对此:

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

为了跳过2个或更多连续非字母字符的情况。

答案 2 :(得分:2)

您的程序会将每个非字母字符视为单词分隔符。如果你的输入字符串中有几个后续的分隔符,你的程序(如所写的那样)将假设有"空的"他们之间的零长度的话。这些"空"单词在输出中显示为额外的空行(当您使用\n跟随每个单词时)。

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

如果您修改输入字符串以包含,,,,,序列,您将看到每个&#34;空字的额外空行&#34;这些逗号之间。

这些空行仅可见,因为您在每次输出后添加了\n字符。如果删除\n,程序仍会找到并打印#34;空单词&#34;,但它们将是&#34;隐藏&#34; (因为它们的长度为零)。或者,您可以简单地从输出中过滤掉零长度的单词。

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