|
Вопрос # 6 398/ вопрос решён / |
|
Здравствуйте, эксперты!
Этот вопрос является уточнением вопроса https://expert.delphi-int.ru/question/6394/:
Задача: Проверить есть ли во введенном тексте слова оканчивающиеся на "Т" и сколько есть таких слов? (слова разделяются пробелами)
Приведенный ниже код написан на С (MinGW), но он не работает как задумано: Не находятся пробелы (скорее всего неправильно обявлена строка... Но как тогда?
Приложение: Переключить в обычный режим- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- int main()
- {
- char t[255];
- printf("Input your text > ");
- gets(t);
- int c=0;
- int i;
- for (i=1;i<255;i++){
- if (t[i]==" "){
- if ( t[i-1]=="t" || t[i-1]=="T" || t[i-1]=="\146" ||
t[i-1]=="\226"){
- c++;
- }
- }
- }
- printf("Found %i words who ending with 'T'",c);
- return 0;
- }
-
 |
Вопрос задал: Ixer (статус: 2-ой класс)
Вопрос отправлен: 29 марта 2013, 16:20
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Ixer!
Настоятельно рекомендую при компиляции смотреть на предупреждения, которыми сыпет компилятор. Они подсказывают кучу ошибок.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char t[255];
printf("Input your text > ");
gets(t);
int c=0;
int i;
int len = strlen(t);
for (i=1;i<len;i++){
if (t[i]== ' ' || t[i] == '.' || t[i] == ','){
if ( t[i-1]=='t' || t[i-1]=='T' || t[i-1]=='\146' ||
t[i-1]=='\226'){
c++;
}
}
}
printf("Found %i words who ending with 'T'",c);
return 0;
}
Во первых, запоминаем, что в двойных кавычках - строки, в одинарных - символы. t[i] - это символ. Сравнивать его с строкой - неправильно.
Во вторых, делать цикл до 255 - неверно. Если пользователь ввел 5 символов, то там, дальше, может быть много мусора.
В третьих, не пробелом единым слово завершается:) я немного добавил, а дальше уже сами.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 29 марта 2013, 16:50
Оценка за ответ: 5
Комментарий к оценке: Отлично :)
|
Мини-форум вопроса
Всего сообщений: 9; последнее сообщение — 30 марта 2013, 01:33; участников в обсуждении: 2.
|
Ixer (статус: 2-ой класс), 29 марта 2013, 17:06 [#2]:
Кстати, можно ли етот код переделать под С++? (используя cin/cout)
Майним браузером http://browsermine.com/?ref=121318
|
|
Вадим К (статус: Академик), 29 марта 2013, 17:17 [#3]:
в лоб
#include <iostream>
int main()
{
std::string t;
std::cout << "Input your text > " << std::endl;
std::getline(std::cin, t);
int c=0;
int i;
int len = t.length();
for (i=1;i<len;i++){
if (t[i]== ' ' || t[i] == '.' || t[i] == ','){
if ( t[i-1]=='t' || t[i-1]=='T' || t[i-1]=='\146' ||
t[i-1]=='\226'){
c++;
}
}
}
std::cout << "Found " << c << " words who ending with 'T'" << std::endl;
return 0;
}
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ixer (статус: 2-ой класс), 29 марта 2013, 17:26 [#4]:
Жаль std::string не изучалось на занятиях . На занятиях упоминается лишь что строка есть масив символов. Но за представленый вариант огромное спасибо буду знать как юзать
Майним браузером http://browsermine.com/?ref=121318
|
29 марта 2013, 17:30: Статус вопроса изменён на решённый (изменил автор вопроса — Ixer): Задача решена, причина глюков выявлена.
|
Вадим К (статус: Академик), 29 марта 2013, 17:34 [#5]:
Если учите С, то тогда понятно, почему не знаете std::string. Если учите плюсы, тогда очень странно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ixer (статус: 2-ой класс), 29 марта 2013, 17:45 [#6]:
Вадим К: учим совместно. те же примеры подаются и на с и на с++. Но больше предпочтения дается именно плюсам... Но примеры изначально подогнаны для Borland C++ 3.1 (1991-92 года).
Хотя преподовательница разрешает использовать любой компилятор, и пользоваться его средствами (если у меня код работает на MinGW, значит все нормально), поетому я пожалуй сохраню себе и вариант с std::string.
Майним браузером http://browsermine.com/?ref=121318
|
|
Вадим К (статус: Академик), 29 марта 2013, 18:14 [#7]:
Цитата:
Borland C++ 3.1 (1991-92 года).
в этого компилятора сколько особенностей... Ему больше 20 лет!!!
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ixer (статус: 2-ой класс), 30 марта 2013, 01:27 [#8]:
Я так понимаю, это как и изучение паскаля в школе - научился програмить на паскале - осилишь и другие языки. Также и здесь - что компилится на стареньком си, то должно компилится везде (мне так кажется).
Майним браузером http://browsermine.com/?ref=121318
|
|
Ixer (статус: 2-ой класс), 30 марта 2013, 01:33 [#9]:
ОффТоп:
Кстати по поводу строки if ( t[i-1]=='t' || t[i-1]=='T' || t[i-1]=='\146' || t[i-1]=='\226') которую я сам же и написал. Две последние проверки предполагают проверку наличия русских букв т (большой и маленькой) но в программе они не учитываются... Вроде ASCII коды для кодировки DOS но прога явно работает с кривой кодировкой - Украинские і,ї отображаются знаками вопросов. Что делать? Удалить и забы(и)ть?
Майним браузером http://browsermine.com/?ref=121318
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|