程序查找元音,如果语句未分配正确的值

时间:2019-04-25 13:34:05

标签: c arrays string if-statement

我有一个简单的程序来查找字符串中的元音。 for循环应该遍历该字符串,并使用char和if else块查看char是否与任何元音匹配,但输出仅为100 As。

我尽力使它们全部融为一体,但这给了我们所有人。

#include <stdio.h>

int main()
{
    const int SIZE = 100;

    char str[SIZE] = {"the brown fox\0"};
    char vowels[SIZE];

    for (int i = 0; i <= SIZE; i++) {

        if (str[i] == '97' || '65') {

            vowels[i] = 'a';

        }

        else if (str[i] == '101' || '69' ) {

            vowels[i] = 'e';

        }

        else if (str[i] == '105' || '73') {

            vowels[i] = 'i';

        }

        else if (str[i] == '111' || '81') {

            vowels[i] = 'o';

        }

        else if (str[i] == '117' || '85')  {

            vowels[i] = 'u';

       }

        printf("%c", vowels[i]);

    }

    return 0;
}

编辑:修复了例如(str [i] =='97'|| str [i] =='65')现在正在打印奇怪的符号

编辑2:新代码

#include <stdio.h>

int main()
{
    const int SIZE = 100;

    char str[SIZE] = {"the brown fox\0"};
    char vowels[SIZE];

    for (int i = 0; i <= SIZE; i++) {

        if (str[i] == 'a' || str[i] == 'A') {

            vowels[i] = 'a';

        }

        else if (str[i] == 'e' || str[i] =='E' ) {

            vowels[i] = 'e';

        }

        else if (str[i] == 'i' || str[i] == 'I') {

            vowels[i] = 'i';

        }

        else if (str[i] == 'O' || str[i] == 'o') {

            vowels[i] = 'o';

        }

        else if (str[i] == 'u' || str[i] == 'U')  {

                vowels[i] = 'u';

             }

            printf("%c", vowels[i]);

        }

        return 0;
   }

编辑3:即使在循环开始时按提示将元音初始化为''之后,奇怪的符号也消失了,但仍然无法正常工作。

3 个答案:

答案 0 :(得分:3)

您正在将自己的字符str[i]'97'进行比较

  

6.4.4.4

     

一个整数字符常量的类型为int。包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符表示形式的数值。包含多个字符(例如'ab')或不映射到单字节执行字符的字符或转义序列的整数字符常量的值由实现定义。

如果要比较字符,可以使用ascii值,例如97或直接将字符与'c'一起使用。

为了获得更好的可维护性和可读性,我更喜欢直接使用char。

您的代码中还有其他问题:

首先,在您的for循环中:for (int i = 0; i <= SIZE; i++) { 由于<=,您在数组中走得太远了,因为数组ID以0开头,如果您键入str[100],实际上您使用的是第101个字符。

另一个问题是您的if语句:if (str[i] == '97' || '65') {

此处的if语句等效于if (str[i] == '97' || '65' != 0) {

考虑重新键入str[i] ==if (str[i] == '97' || str[i] == '65') {

此外,别忘了我提到的关于您的'97'

的第一个问题

答案 1 :(得分:2)

您有很多小问题,总结如下:

#define SIZE 100    /* if you need a constant, #define one (or more) */
...
    char vowels[SIZE] = ""; /* initialize all zero, {0) is valid also */

整数常量是通过#define或使用enum创建的。合格的const int不是恒定整数。 (这表示VLA在C99中是合法的,但在C11中是可选的)

    int idx = 0;            /* separate index for filling vowels array */

保留单独的索引以填充vowels数组。

        /* don't use magic-numbers in your code */
        if (str[i] == 'a' || str[i] == 'A') {

不要使用魔术数字,而是在代码中使用文字常量来生成更具可读性的代码。

您的程序接受参数,使用它们来传递字符串以进行解析(或从stdin中读取),例如

int main (int argc, char **argv) {

    const char *str = (argc > 1) ? argv[1] : "the brown fox";
    ...

test ? if_true : if_false运算符称为三元运算符。它允许简单的在线条件根据test条件(例如(argc > 1))选择两个值之一

如果您打算使用vowels作为字符串,请不要忘记在循环后使用终止符(nul-terminate)的元音,例如

    vowels[idx] = 0;                /* nul-terminate vowels */

更正所有错误并将参数添加到main()中,您可以执行以下操作:

#include <stdio.h>

#define SIZE 100    /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {

    const char *str = (argc > 1) ? argv[1] : "the brown fox";
    char vowels[SIZE] = ""; /* initialize all zero, {0) is valid also */
    size_t idx = 0;         /* separate index for filling vowels array */

    for (int i = 0; idx < SIZE - 1 && str[i]; i++) {
        /* don't use magic-numbers in your code */
        if (str[i] == 'a' || str[i] == 'A') {
            vowels[idx++] = 'a';    /* assign 'a', increment index */
        }
        else if (str[i] == 'e' || str[i] == 'E' ) {
            vowels[idx++] = 'e';
        }
        else if (str[i] == 'i' || str[i] == 'I') {
            vowels[idx++] = 'i';
        }
        else if (str[i] == 'o' || str[i] == 'O') {
            vowels[idx++] = 'o';
        }
        else if (str[i] == 'u' || str[i] == 'U')  {
            vowels[idx++] = 'u';
        }
    }
    vowels[idx] = 0;                /* nul-terminate vowels */
    printf (" %zu vowels: ", idx);  /* print number of vowels */
    for (int i = 0; vowels[i]; i++) /* output each vowel, comma-separated */
        printf (i > 0 ? ", %c" : "%c", vowels[i]);
    putchar ('\n');                 /* tidy up with newline */

    return 0;
}

使用/输出示例

bin\vowels.exe "a quick brown fox jumps over the lazy dog"
 11 vowels: a, u, i, o, o, u, o, e, e, a, o

答案 2 :(得分:1)

取决于编译器str[i] == '117'(以及其余的编译器)可能会给您带来错误,因为仅当您要实现与'a'之类的单个字符的ascii等效项时才使用符号引号。因此str[i] == '117'正在检查str[i]是否等于“ 117”的ascii等效值。

除“ ||”是逻辑“或”运算符外。写下str[i] == '111' || '81'时,仅表示“查找111和81(不存在)的ascii码,在“或”运算中使用它们,检查结果是否等于str [i]”。

最后但并非最不重要的一点是,我在网上发现了一个不错的函数,可能有助于使您的代码更紧凑

int isvowel(int ch)
{
     int c = toupper(ch);

     return (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U');
}

简短地解释一下,如果给定int ch的等价字符为小写,则函数将其更改为大写并检查它是否为大写元音,如果给定的整数已经等于大写元音{{1} }没有任何改变。

实施可以通过以下方式完成:

int c = toupper(ch);