【问题标题】:Get C to read more than one character in a single input让 C 在单个输入中读取多个字符
【发布时间】:2020-10-25 21:39:38
【问题描述】:

我是 C 新手,我正在寻找一个程序,它接受一个单词,说“Aloha”作为输入,记下单词中的所有元音和辅音,并计算单词中的字符数.

我创建了函数来确定单个字符是夏威夷语中的元音还是辅音,但我不知道如何让程序读取多个字符作为输入。比如下面的代码中

#include <stdio.h>

int is_vowel(char);
int is_consonant(char letter);

int main() {

char letter;
int vowel, consonant;

    printf("Please input a Hawaiian word:");
    scanf("%c", &letter);

    vowel = is_vowel(letter);
    consonant = is_consonant(letter);

    if (vowel == 1) {

        printf("%c is a vowel. \n", letter);
    } else {

        printf("%c is not a vowel. \n", letter);
    }


    if (consonant == 1) {

    printf("%c is a consonant. \n", letter);
} else {

    printf("%c is not a consonant. \n", letter);
}

}

当用户输入“Aloha”时,输出为 “A是元音。 A 不是辅音”,然后停止。

而不是“A是元音,A不是辅音。l不是元音,l是辅音”等等。

如何让 C 一次读取输入中的所有字符,并让函数(未包含在示例代码中)检查每个字符?

谢谢!

【问题讨论】:

  • 您是否打算强制使用 Hawaiian Alphabet 的正确辅音——H、K、L、M、N、P、W——还是可以忽略这个细节?
  • @JonathanLeffler OP 已经涵盖了这一点:“我已经创建了函数来确定单个字符是 夏威夷语中的元音还是辅音”(强调添加)
  • @BrianDrake — 但是 OP 并没有表现出这种知识,尽管我同意它可能是这样的。并非所有问题的读者都知道夏威夷语的有限字母表。并且没有任何非夏威夷输入的示例输出 - 例如input。但这只是值得评论的(如果几乎没有的话);这就是为什么它在评论中。答案也不能证明这些知识。

标签: c char


【解决方案1】:

输入应该是:a-z 或 A-Z

#include <stdio.h>
#include <string.h>

int is_vowel(char ch) {
    if(ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u') return 1;
    else if(ch=='A' || ch=='E' || ch=='I' || ch=='O' || ch=='U') return 1;
    else return 0;
};
int is_consonant(char ch) {
    if(is_vowel(ch) == 0) return 1;
    else return 0;
};

int main()
{
    char letter[100];
    int vowel, consonant;
    int i, length;

    printf("Please input a Hawaiian word: ");
    scanf("%[^\n]s", &letter);
    length = strlen(letter);

    for(i=0; i<length; i++) {

        vowel = is_vowel(letter[i]);
        consonant = is_consonant(letter[i]);
        if (vowel == 1) {
            printf("%c is a vowel. \n", letter[i]);
        }
        else {
            printf("%c is not a vowel. \n", letter[i]);
        }

        if (consonant == 1) {
            printf("%c is a consonant. \n", letter[i]);
        }
        else {
            printf("%c is not a consonant. \n", letter[i]);
        }
        printf("\n");
    }

    return 0;
}

【讨论】:

  • 仅供参考:scanf("%[^\n]s", &amp;letter); 这行说明了四个 常见问题: (1) s 是闯入者;扫描集%[…] 是完整的转换规范,而不是s 转换规范的修饰符。 (2) 您应该指定%99[^\n] 以防止溢出。 (3) 你应该传递letter(类型char *)而不是&amp;letter(类型char (*)[100]),因为扫描集需要char * 参数。 (4) 你应该检查你是否得到了你期望的输入:if (scanf("%99[^\n]", letter) != 1) { …oops; handle error… } else { …proceed… }
  • OP已经实现了is_vowel()is_consonant(),并没有要求实现这些功能。您提供了 incorrect 实现:它们应该是夏威夷语,而不是英语。您使用了一种适用于英语的有趣优化:当且仅当字母不是元音时,它才是辅音。但是你还没有在main() 中利用这一点,同时调用is_vowel()is_consonant()。 (编辑:我提到的main() 中的代码是从 OP 复制的。)
【解决方案2】:

有用的工具是:

  • 数组:可以使用索引访问的连续变量序列
  • %s 格式指定器:让 scanf() 读取字符串(以 NUL 结尾的字符序列)
  • for(initializer; condition; update) { body } 循环:
    1. 执行initializer
    2. condition 为真时重复执行bodyupdate

试试这个:

#include <stdio.h>

int is_vowel(char);
int is_consonant(char letter);

int main() {
    char letters[102401]; /* allocate enough size */
    int i;

    printf("Please input a Hawaiian word:");
    if (scanf("%102400s", letters) != 1) { /* read input with length limit and check if it succeeded */
        puts("input error");
        return 1;
    }

    for (i = 0; letters[i] != '\0'; i++) { /* loop over the letters read */
        char letter = letters[i];
        int vowel, consonant;

        vowel = is_vowel(letter);
        consonant = is_consonant(letter);

        if (vowel == 1) {

            printf("%c is a vowel. \n", letter);
        } else {

            printf("%c is not a vowel. \n", letter);
        }


        if (consonant == 1) {

            printf("%c is a consonant. \n", letter);
        } else {

            printf("%c is not a consonant. \n", letter);
        }
    }
}

【讨论】:

  • 为什么将变量声明(lettervowelconstant)(以前位于 main() 的开头)移到循环中?它们在 main() 的开头非常好,您在其中添加了另外两个声明。如果您出于某种原因想要在循环中声明,那么您当然应该这样做for (int i = 0; ...)
  • OP 还想“计算[]单词中的字符数”。所以让我们将i 定义在循环之外。现在,在循环之后,i 是终止空字节的索引。这意味着i - 1 是字符串最后一个字符的索引,i 是字符串的长度。所以我们可以写printf("The number of characters in the word is %i. \n", i);
猜你喜欢
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2014-04-19
  • 2021-01-19
相关资源
最近更新 更多