Проверить, верно ли, что k-ое слово имеет четную длину? - C (СИ)
Формулировка задачи:
Помогите, пожалуйста, найти ошибку в программе. Ошибка программы в том, что если например ввести строку "101 101 10 101" и натуральное число 1, то она всегда говорит "Верно". Хотя число нечетное. Такое чувство, что просто введи любую строку и натуральное число 1 - программа выдаст всегда "Верно"
Само задание звучит так:
Дана символьная строка и целое число 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
}Решение задачи: «Проверить, верно ли, что 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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с функциями ввода-вывода и строками.
- Определяем константы: количество слов в строке (N), разделитель слов (D).
- Устанавливаем локаль на русский язык.
- Объявляем переменные: — k — номер слова; — i — счётчик слов; — s — строка, в которой находятся слова; — ptr — указатель на текущее слово.
- Запускаем цикл, который продолжается до тех пор, пока пользователь не введёт -1.
- Очищаем буфер ввода, считывая все символы до новой строки.
- Запрашиваем у пользователя строку.
- Разбиваем строку на слова и проверяем каждое слово на чётность его длины.
- Если длина текущего слова совпадает с номером слова, который указал пользователь, то проверяем, является ли эта длина чётной.
- Если длина слова чётная, то выводим сообщение о том, что слово имеет чётную длину.
- Если длина слова нечётная, то выводим сообщение о том, что слово имеет нечётную длину.
- Если длина слова совпадает с номером слова, который указал пользователь, и длина слова нечётная, то выводим соответствующее сообщение и завершаем цикл.
- Завершаем функцию и программу.