Проблема запустить вложенный цикл в C, чтобы перебрать аргументы - PullRequest
0 голосов
/ 08 ноября 2019

Я озадачен следующим кодом, целью которого является перебирать все заданные строковые аргументы и печатать только гласные.

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

int main(int argc, char *argv[])
{
    if (argc == 1){
        printf("ERROR: You need one argument.\n");
        // this is how you abort your program
        return 1;
    }

    int i = 1;
    int j = 0;
    printf("Printing number of arguments %d\n", argc);

    for (i = 1; i <= argc; i++){
        for (j = 0; argv[i][j] != '\0'; j++) {

            char letter = argv[i][j];

            if(letter >= 'A' && letter <= 'Z'){
                letter = letter + 32;
            }

            switch (letter) {
                case 'a': 
                    printf("'A'\n");
                    break;

                case 'e':
                    printf("'E'\n");
                    break;

                case 'i':
                    printf("'I'\n");
                    break;

                case 'o':
                    printf("'O'\n");
                    break;

                case 'u':
                    printf("'U'\n");
                    break;

                case 'y':
                    if (i > 2) {
                    // it's only sometimes Y
                    printf("'Y'\n");
                    }
                    break;

                default:
                    printf("%c is not a vowel\n", letter);
                }
            }
        return 0;
    }
}

Программа работает, но печатает только первый аргумент, который я передаю при вызове ./ MARIANO ARGUELLO RIVERA

, она печатает только результаты для аргумента MARIANO и игнорирует все остальные.

Мое предположение (и я все еще смотрю на экран, пытаясь найти решение), находится во втором цикле argv[i][j] != '\0', когда программа переходит к первому аргументу, видит нольбайт , в конце первой строки, останавливает итерацию и не переходит ко второй, чтобы обработать ее.

Я прав?

Или я должен позаботиться о других деталях кода, чтобы итерация прошла успешно?

Спасибо

1 Ответ

0 голосов
/ 08 ноября 2019

Вы сделали забавную ошибку:)

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

int main(int argc, char *argv[])
{
    if (argc == 1){
        printf("ERROR: You need one argument.\n");
        // this is how you abort your program
        return 1;
    }

    int i = 1;
    int j = 0;
    printf("Printing number of arguments %d\n", argc);

    for (i = 1; i <= argc; i++){
        for (j = 0; argv[i][j] != '\0'; j++) {

            char letter = argv[i][j];

            if(letter >= 'A' && letter <= 'Z'){
                letter = letter + 32;
            }

            switch (letter) {
                case 'a': 
                    printf("'A'\n");
                    break;

                case 'e':
                    printf("'E'\n");
                    break;

                case 'i':
                    printf("'I'\n");
                    break;

                case 'o':
                    printf("'O'\n");
                    break;

                case 'u':
                    printf("'U'\n");
                    break;

                case 'y':
                    if (i > 2) {
                    // it's only sometimes Y
                    printf("'Y'\n");
                    }
                    break;

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

    }
        return 0;
}

Я просто сделал одно исправление. Пожалуйста, проверьте сейчас., Это работает сейчас:)

...