ошибка инициализации cs50 с печатным выводом

Я работаю над инициалами Cs50 pset2. Когда я запускаю программу, она распечатывает первые 2 буквы имени, а также 2-ю, 4-ю и 6-ю буквы фамилии. Мне интересно, неправильный ли мой прирост? Спасибо

вот мой код..

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

int main(void)
{
    // variables
    string urName;
    char init;
    int i;

    // get user input
    printf("Please state your full name:\n");

    do 
    {
        urName = get_string();
    }
    while (urName == NULL);

    printf("%c", toupper(urName[0]));

    for (i = 0, init = strlen(urName); i < init; i++)
    {
        if ((urName[i]) != '\0')
        { 
            printf("%c", toupper(urName[i+1]));
            i++;
        }
    }

    return 0;
}

А вот пример вывода..

Please state your full name:
den nguyen
DE GYN~/workspace/pset2/ $ 

person dennievn    schedule 30.03.2017    source источник
comment
Ваши приращения неверны. У вас есть два приращения: одно в заголовке цикла for, другое в теле. Вам нужен только один (первый)..   -  person DYZ    schedule 31.03.2017
comment
Спасибо, я удалил последний шаг. Очень признателен :)   -  person dennievn    schedule 01.04.2017


Ответы (1)


Как упомянул DYZ, вы увеличиваете свой счетчик на 2 экземпляра внутри цикла for:

for (i = 0, init = strlen(urName); i < init; i++) // "i" is incremented here
{
    if ((urName[i]) != '\0')
    { 
        printf("%c", toupper(urName[i+1]));
        i++; // "i" is also incremented here
    }
}

Увеличивая i дважды, компилятор пропускает одну букву при каждой итерации цикла for. Чтобы исправить это, вам нужно удалить i++, который находится внутри цикла for, чтобы работал только инкрементный счетчик внутри условия цикла for:

for (i = 0, init = strlen(urName); i < init; i++) // "i" only needs to be incremented here
{
    if ((urName[i]) != '\0')
        printf("%c", toupper(urName[i+1]));
}
person BusyProgrammer    schedule 31.03.2017
comment
И поскольку init = strlen(urName) гарантирует, что urName[i] не будет нулевым байтом, внутренний тест является избыточным (на данный момент). Модифицированный тест станет актуальным, когда код попытается определить начальную букву каждого слова — на данный момент он просто переводит все в верхний регистр. Код может быть таким: for (int i = 0; urName[i] != '\0'; i++) { putchar(toupper((unsigned char)urName[i])); } (который также устраняет некоторые другие мелкие проблемы — вы можете восстановить printf("%c", toupper(…));, если хотите). - person Jonathan Leffler; 01.04.2017
comment
Большое спасибо за все отличные отзывы. Я поиграю с предложенными вами условиями и немного почищу свой код. Удивлен, увидев putchar(), я еще не изучил эту функцию, поэтому буду использовать ее, пока мой код проходит проверку 50. хD - person dennievn; 01.04.2017
comment
@omegaD Если мой ответ сработал, поставьте галочку рядом с моим ответом. Когда вы это сделаете, он должен стать зеленым. Спасибо! - person BusyProgrammer; 01.04.2017