C/C++
Помогите пожалуйста с программированием на C!
Задача: дана строка (символьный массив) и некоторая буква. Найти и вывести все слова в строке, начинающиеся на эту букву. Мне бы, если не код, то хотя бы идею, как это реализовать.
Попробуй этот, сразу скажу, это ChatGPT, я сам только учусь, и то не на С а на Python
#include <stdio.h>
#include <string.h>
int main() {
char str[100], letter;
int i, j, word_start, word_end;
printf("Enter a string: ");
fgets(str, 100, stdin); // ввод строки с помощью fgets()
printf("Enter the starting letter: ");
scanf("%c", &letter); // ввод буквы с помощью scanf()
for (i = 0; i < strlen(str); i++) {
// определение начала и конца слова
if (i == 0 || str[i-1] == ' ') {
word_start = i;
while (str[i] != ' ' && str[i] != '\n' && str[i] != '\0') {
i++;
}
word_end = i;
// проверка, начинается ли слово на заданную букву
if (str[word_start] == letter) {
// вывод слова на экран
for (j = word_start; j < word_end; j++) {
printf("%c", str[j]);
}
printf("\n"); // переход на новую строку после вывода слова
}
}
}
return 0;
}
#include <stdio.h>
#include <string.h>
int main() {
char str[100], letter;
int i, j, word_start, word_end;
printf("Enter a string: ");
fgets(str, 100, stdin); // ввод строки с помощью fgets()
printf("Enter the starting letter: ");
scanf("%c", &letter); // ввод буквы с помощью scanf()
for (i = 0; i < strlen(str); i++) {
// определение начала и конца слова
if (i == 0 || str[i-1] == ' ') {
word_start = i;
while (str[i] != ' ' && str[i] != '\n' && str[i] != '\0') {
i++;
}
word_end = i;
// проверка, начинается ли слово на заданную букву
if (str[word_start] == letter) {
// вывод слова на экран
for (j = word_start; j < word_end; j++) {
printf("%c", str[j]);
}
printf("\n"); // переход на новую строку после вывода слова
}
}
}
return 0;
}
#include //printf,fgets,scanf
#include //strtok
//внимание! код работает только с однобайтными буквами, тоесть
//гарантированно с английскими или с однобайтными кодировками.
int main()
{
char str[200]{}, *word = NULL, ch; //буфер для строки, для слова и буква
printf("Enter sting:\n");
fgets(str, 200, stdin); //ввод строки максимальной длинной 199 букв в строку str
//кстати если ввести 200 или больше символов, то лишние остануться
//и scanf не будет дожидаться ввода новой буквы, а заберет одну из них.
printf("Enter char:\n");
scanf("%c", &ch); //ввод буквы
while (word = strtok(word ? NULL : str, " ")) //продолжаем цикл пока strtok извлекает слова
//word ? NULL : str означает что:
//вначале word = 0, т.е. при первом вызове strtok первым аргументом будет str
//при дальнейших выховах, когда word!=0
//аргумент будет NULL.
//Второй аргумент - строка разделителей (т.е. что не является буквой)
//Тут указан лишь пробел. Но можно добавить знаки препинания и другие.
{
if (*word == ch) printf("%s\n", word); //если первая буква совпадает с заданой - вывести
}
}
Борис Быкасов
А где сказано, что один символ занимает 1 байт?
Борис Быкасов
И где сказано, что слова в строке разделены пробелом?
Начинаем с первого символа, сравниваем с заданной буквой. Если совпадает, идем дальше по строке в поисках пробела, попутно "включаем" переменную i, в которой считаем порядковый номер каждого символа. Как только нашли пробел, строку с первого символа до пробела копируем в новую переменную s.
Дальше считываем символ и если это не пробел, сравниваем с заданной буквой, если равно - идем до пробела. Копируем часть строки с порядкового номера буквы до пробела в s. Повторяем в цикле до конца заданной строки.
Дальше считываем символ и если это не пробел, сравниваем с заданной буквой, если равно - идем до пробела. Копируем часть строки с порядкового номера буквы до пробела в s. Повторяем в цикле до конца заданной строки.
Ты бы хотя бы массив предоставил
Задача далеко не так проста, как может показаться с первого взгляда. Заковырка в этом:
Кроме того, в ТЗ ничего не указано про то, каким образом разделяются слова в строке. Если взять строки из реального языка, то слова могут разделяться не только пробелами, но и целой кучей других байт. Например в качестве разделителя вполне могут использоваться байты из строки
дана строка (символьный массив) и некоторая буква.
Так вот, при постановке ТЗ ничего не сказано о том, в какой кодировке дана эта строка. А это значит, что вы не знаете, сколько байт занимает одна буква. А она, ВНЕЗАПНО, может занимать не один байт а несколько. Поэтому говнокод от ChatGPT с использованием богомерзкой scanf вида scanf("%c", &letter); // ввод буквы с помощью scanf()
внезапно может оказаться нерабочим. Нормальный код должен вводить букву как строку.Кроме того, в ТЗ ничего не указано про то, каким образом разделяются слова в строке. Если взять строки из реального языка, то слова могут разделяться не только пробелами, но и целой кучей других байт. Например в качестве разделителя вполне могут использоваться байты из строки
" \t\n\r.,+-*/=:;()[]\"'`"
Использование isalpha, как было предложено выше, на самом деле, не самая лучшая идея, но вы можете смело использовать другие функции, например #include
int isspace(int c);
int isblank(int c);
int ispunct(int c);
int isdigit(int c);
Общий алгоритм такой: - Двигаемся по строке, игнорируя пробелы и т.п. символы-разделители, пока не дойдем до начала слова или окончания строки
- Запоминаем позицию или указатель на начало слова
- Двигаемся дальше по строке до тех пор, пока не найдем новый символ-разделитель или конец строки. Это будет конец слова.
- Выделяем слово от начала и до конца и работаем с ним дальше. Для сравнения буквы используем strncmp
- Возвращаемся к пункту №1, начиная выделение нового поля с позиции конца предыдущего поля
Сергей Кузубов
Посимвольно двигаться не надо.
Давно strtok() и wcstok() придумали:))
Двигайся по словам.
Это быстрей в разы.
Давно strtok() и wcstok() придумали:))
Двигайся по словам.
Это быстрей в разы.
создай вектор строк
используй isalpha, чтобы знать где граница слова.
создай два цикла.
один встроен в другой
первый цикл идёт по строке символ за символом.
если найдена буква слова, то она добавляется новым словом в вектор.
включается внутренний цикл, идущий до конца этого слова и он добавляет по симвалу в последнее слово вектора.
Когда циклы завершатся, создаёшь новый цикл идущий по вектору.
внутри тоже встроенный цикл, идущий по слову, ищущий нужную букву. как только нашёл, выводи текущее слово в векторе на экран и прерывай внутренний цикл
я написал про си плюс плюс
в си вместо вектора строк нужно использовать двойной массив символов достаточно большого размера
используй isalpha, чтобы знать где граница слова.
создай два цикла.
один встроен в другой
первый цикл идёт по строке символ за символом.
если найдена буква слова, то она добавляется новым словом в вектор.
включается внутренний цикл, идущий до конца этого слова и он добавляет по симвалу в последнее слово вектора.
Когда циклы завершатся, создаёшь новый цикл идущий по вектору.
внутри тоже встроенный цикл, идущий по слову, ищущий нужную букву. как только нашёл, выводи текущее слово в векторе на экран и прерывай внутренний цикл
я написал про си плюс плюс
в си вместо вектора строк нужно использовать двойной массив символов достаточно большого размера
#include<stdio.h>
#include<wchar.h>
#include<locale.h>
#include<stdlib.h>
int main()
{
wchar_t text[1025] = {0},
*filter = L" ;,.:?!", *pos, smb;
setlocale(LC_ALL, "Russian");
wprintf(L"Введите текст:\n");
fgetws(text, sizeof(text), stdin);
wprintf(L"\nВведите начальную букву в слове: ");
wscanf(L"%lc", &smb);
wchar_t *word = wcstok(text, filter, &pos);
while(word != NULL)
{
if(word == NULL) break;
if(word[0]==smb)
wprintf(L"\nНайдено слово: %ls", word);
word = wcstok(NULL, filter, &pos);
}
return 0;
}
#include<wchar.h>
#include<locale.h>
#include<stdlib.h>
int main()
{
wchar_t text[1025] = {0},
*filter = L" ;,.:?!", *pos, smb;
setlocale(LC_ALL, "Russian");
wprintf(L"Введите текст:\n");
fgetws(text, sizeof(text), stdin);
wprintf(L"\nВведите начальную букву в слове: ");
wscanf(L"%lc", &smb);
wchar_t *word = wcstok(text, filter, &pos);
while(word != NULL)
{
if(word == NULL) break;
if(word[0]==smb)
wprintf(L"\nНайдено слово: %ls", word);
word = wcstok(NULL, filter, &pos);
}
return 0;
}
Абай Манарбай
Результат работы этого кода под Linux очень далек от авторского замысла :D
Что не так в этом коде?
Строка
Что не так в этом коде?
setlocale(LC_ALL, "Russian");
Название локали "Russian" не переносимо. Попытка выполнения в системах, отличных от Windows очень сильно удивит результатом. Строка
if(word == NULL) break;
никогда не выполнится.
Абай Манарбай
#include
#include
#include
#include
#define BUF_SIZE 1024
int main()
{
wchar_t text[BUF_SIZE] = {0},
*filter = L" ;,.:?!", *pos, smb;
setlocale(LC_ALL, "");
wprintf(L"Введите текст:\n");
fgetws(text, BUF_SIZE, stdin);
wprintf(L"Введите начальную букву в слове: ");
wscanf(L"%lc", &smb);
wchar_t *word = wcstok(text, filter, &pos);
while(word != NULL)
{
word = wcstok(NULL, filter, &pos);
if(word)
{
if(word[0]==smb) wprintf(L"Найдено слово: '%ls'\n", word);
}
}
return 0;
}
Эта версия корректно работает в Linux Похожие вопросы
- Помогите пожалуйста с программированием на C++
- Помогите пожалуйста написать код на c++, выводящий имя, фамилию и дату рождения нескольких человек
- Помогите пожалуйста написать код на C++
- Помоги пожалуйста написать программу на C++
- Помогите, пожалуйста, написать программу на C++ (массивы)
- Помогите пожалуйста решить задачу на C ИЛИ C#
- Помогите пожалуйста написать программу на C++. Срочно нужно, пожалуйста.
- Помогите пожалуйста с задачей на c++, если кто-нибудь захочет помочь.
- Помогите пожалуйста решить задачку по C++, напишите полный текст кода пожалуйста
- Помогите пожалуйста написать программу на C