Задать вопрос
@LebedevImagine

Почему и как этот код на Си работает, если он работать не должен?

Имеется кода с пастебина, который выводит все слова из строки, разделенные пробелом, и которые не имеют цифр в слове.

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

int main()
{
    // строка
    char s[50]; 
    char *ptr;
    int i,k,w = 0;

    puts("Enter a string:" );
    gets(s);

    ptr=strtok(s," ");

    while(ptr)
    {

        w=strlen(ptr);
        for(i=0; i<w; i++)
        {
            if(ptr[i] >= 'a' && ptr[i] <= 'z')
            {
                k++;
                // значение k = 60+ (61, 61, 62.. etc)
                // но почему, если мы его занулили в самом начале программы?
                printf("Debug: k = %i\n", k);
            }
            else
                break;
        }
        // каким образом i учавствует в коде, если мы с ней
        // ничего не делали?? если убрать это условие, код не работает
        if(i == w )
        {
            puts(ptr);
            printf("\n var i = %i\n", i);
        }

        ptr=strtok(NULL," ");
    }

    return 0;
}


Вопрос 1: зачем в этом коде нужна переменная k, если мы с ней в итоге ничего не делаем? Зачем она инкрементируется? Я понимаю, что она нужна для сравнения в условии и считает количество букв в слове, но в условии используется переменная i

Вопрос 2 каким образом учавствует в этом коде переменная i, если в начале мы её занулили и ей ничего не приравнивали? Получается, что переменная w в условии сравнивается с нулем? Если принтить эту переменную для того, чтобы узнать её истинное значение, получается, что переменная имеет значение, отличное от нуля (Почему? Мы ведь ей ничего не присваивали)

Результат кода прикреплен на скриншоте. Как это код работает?5e2f5e7e5ca4e256412584.png
  • Вопрос задан
  • 296 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
но почему, если мы его занулили в самом начале программы?

int i,k,w = 0;

Сюрприз №1: в этой строке мы занулили только w (да и то непонятно зачем).

// каким образом i учавствует в коде, если мы с ней
// ничего не делали?? если убрать это условие, код не работает

for(i=0; i<w; i++)

Сюрприз №2: вот же, i++, какое "ничего"?

зачем в этом коде нужна переменная k,

Переменная k в этом коде не нужна, если не считать единственного printf с её участием.

Как это код работает?

Разбивает исходную строку по пробелам тут: ptr=strtok(s," ");, в цикле for(i=0; i<w; i++) проверяет, что подстрока состоит только из символов 'a'..'z', если да (т.е. i в цикле достиг длины текущей подстроки) -- печатает подстроку. Переходит к следующей подстроке тут: ptr=strtok(NULL," ");
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы