【问题标题】:Printing a string based on a rule in C根据 C 中的规则打印字符串
【发布时间】:2017-06-11 21:09:37
【问题描述】:

我有一个问题,我必须在以下规则之后打印从控制台读取的字符串:在两个连续的元音或辅音之后,我需要打印字符 _ 但如果结尾有两个元音或两个辅音,则不需要字符串,然后我必须打印由每个 _ 字符分隔的子字符串的数量。字符串被读取到 EOF。

我遇到了两个问题:

  • 除非我在新行上键入 EOF (Ctrl-Z),否则程序不会终止。如果我只是将它添加到字符串的末尾,它将继续。

  • 我需要一种方法来检查打印的最后一个字符是否为“_”,如果它位于打印字符串的末尾,则将其删除。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
    char vow[]="aeiouAEIOU", c,x;
    int nr=1;
    x=getchar();
    putchar(x);
    while((c=getchar())!=EOF)
    {
        if(isalpha(c))
        {
            if (((strchr(vow,x)&&strchr(vow,c))||(!strchr(vow,x)&&!strchr(vow,c)))&&x!=0)
            {
                putchar(c);
                putchar('_');
                nr++;
                x=0;
            }
            else
            {
                putchar(c);
                x=c;
            }
        }
    }
    printf("\n%d",--nr);
    return 0;
}

【问题讨论】:

  • 您能否提供所需结果的示例输入/输出文本?
  • while((c=getchar())!=EOF) c 应该是 int,而不是 char。
  • 确实有你的代码。它出什么问题了?问题是什么?
  • 附带说明一下,您拨打strchr 的频率比必要的要高。如果你想用 C 写一个a XOR b,你可以使用!a != !b!strchr(vow,x) != !strchr(vow,c),另外否定你的情况的结果,所以它实际上是!strchr(vow,x) == !strchr(vow,c))。见stackoverflow.com/questions/1596668/logical-xor-operator-in-c

标签: c


【解决方案1】:

除非我在新行上键入 EOF "^Z",否则程序不会终止。如果我只是将它添加到字符串的末尾,它将继续。

这是一个 Windows 命令提示符问题。 Ctrl+z 并不是真正的 EOF,它只是命令提示符的一个信号,当它单独出现在一行中时被解释为 EOF。如果您从终端输入而不是从文件中提供程序标准输入,则通常无法到达 EOF。

我建议您解决这个问题并创建一些 sample.txt 文件作为输入。然后你可以重定向标准输入来读取这个文件,每当读取整个文件时它都会遇到EOF。

我需要一种方法来检查打印的最后一个字符是否为“_”,如果它位于打印字符串的末尾,则将其删除。

不要。

您可以保留一些布尔值来指示是否应在下一个字母数字字符之前打印_,而不是打印和删除。但只有在确实有下一个要打印的字符时才打印它。

int printSeparator = 0;
// ...

    if(isalpha(c))
    {
        if (printSeparator)
        {
            putchar('_');
            printSeparator = 0;
        }
        if (((strchr(vow,x)&&strchr(vow,c))||(!strchr(vow,x)&&!strchr(vow,c)))&&x!=0)
        {
            putchar(c);
            //putchar('_');
            printSeparator = 1;
            nr++;
            x=0;
        }
        else
        {
            putchar(c);
            x=c;
        }
    }

您可能希望将nr++ 计数器移动到打印_ 字符的同一位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2012-09-04
    相关资源
    最近更新 更多