Проверить, верно ли, что k-ое слово имеет четную длину? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, найти ошибку в программе.

Само задание звучит так:

Дана символьная строка и целое число k. Слово - последовательность символов между пробелами, не содержащая пробелы внутри себя. Проверить, верно ли, что в заданной строке k-ое слово имеют четную длину?
{ int k,i,flag;
   char s[255];
   do
   {
       printf("Введите натуральное число: ");
       scanf("%d", &k);
    } while (k<=0);
    char *ptr=strtok(s, " ");
    i=0;
    flag=0;
    while (ptr!=NULL)
    {
       i++;
       printf("%s\n", ptr);
       if (i==k && strlen(ptr) %2 == 0) flag=1;
       ptr=strtok(0, " ");
    }
if (flag==1) printf("Верно\n");
else printf("Не верно\n");
return 0
}
Ошибка программы в том, что если например ввести строку "101 101 10 101" и натуральное число 1, то она всегда говорит "Верно". Хотя число нечетное. Такое чувство, что просто введи любую строку и натуральное число 1 - программа выдаст всегда "Верно"

Решение задачи: «Проверить, верно ли, что k-ое слово имеет четную длину?»

textual
Листинг программы
//В Code:Blocks локаль, к сожалению, не работает, учтите.
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define N 256
#define D " \n"
int main(void)
{
  setlocale(LC_ALL,"RU");
  int k,i;
  char s[N];
  char *ptr;
  while(1)
  {
    printf("Введите номер слова: ");
    scanf("%d",&k);
    if(k==-1)break;// Выходим из цикла набрав -1
    while(getchar()!='\n');// Очищаем буфер(обязательно!)
    printf("Введите строку: ");
    fgets(s,N,stdin);
     for(i=1,ptr=strtok(s,D);ptr!=NULL;ptr=strtok(NULL,D),i++)
     {
       if(i==k)
       {
         if(strlen(ptr)%2==0)
           printf("Верно! Слово имеет чётную длину.\n");
         else
           printf("Не верно! Слово имеет не чётную длину.\n");
         break;
       } 
     }   
  }
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с функциями ввода-вывода и строками.
  2. Определяем константы: количество слов в строке (N), разделитель слов (D).
  3. Устанавливаем локаль на русский язык.
  4. Объявляем переменные: — k — номер слова; — i — счётчик слов; — s — строка, в которой находятся слова; — ptr — указатель на текущее слово.
  5. Запускаем цикл, который продолжается до тех пор, пока пользователь не введёт -1.
  6. Очищаем буфер ввода, считывая все символы до новой строки.
  7. Запрашиваем у пользователя строку.
  8. Разбиваем строку на слова и проверяем каждое слово на чётность его длины.
  9. Если длина текущего слова совпадает с номером слова, который указал пользователь, то проверяем, является ли эта длина чётной.
  10. Если длина слова чётная, то выводим сообщение о том, что слово имеет чётную длину.
  11. Если длина слова нечётная, то выводим сообщение о том, что слово имеет нечётную длину.
  12. Если длина слова совпадает с номером слова, который указал пользователь, и длина слова нечётная, то выводим соответствующее сообщение и завершаем цикл.
  13. Завершаем функцию и программу.

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы