С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
2 / 3 / 3
Регистрация: 02.11.2010
Сообщений: 129

Написать функцию, которая возвращает 1, если строка str1 расположена в конце строки str2

12.07.2011, 17:20. Показов 4242. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать и протестировать функцию STREND(str1, str2), которая возвращает 1, если строка str1 расположена в конце строки str2, и 0 - в противном случае.

Начал писать (пока без функции), но чтот оно не хочет правильно работать.
Суть в том, чтоб проверить 1 строку и 2 строку с конца на совпадения...

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
void main()
{
    int dlin1str;
    int dlin2str;
    int j=0;
    int i;
   // char str1[50];
   // char str2[100];
//  gets(str1);
//  gets(str2);
//  puts(str1);
//  puts(str2);
char str1[]="CTPOKA";
char str2[]="String2. CTPOKA";
    dlin2str=strlen(str2);
    dlin1str=strlen(str1);
    j=dlin1str;
printf("%d %d\n",dlin1str,dlin2str);
    for(i=dlin2str;i>=0;i--)
    {
        if(str2[i]==str1[j])
        {
 printf("%c %c Ok!\n",str1[i],str2[j]);
        }
        j--;
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.07.2011, 17:20
Ответы с готовыми решениями:

Написать функцию primer(str1, str2) удаляющую из строки str1 последнее вхождение строки str2. Функция возвращает указатель str1
помогите пожалуйста

Написать функцию replace(str1, str2,str3), заменяющая в строке str1 все вхождения строки str2 строкой str3
Написать функцию replace(str1, str2,str3), заменяющая в строке str1 все вхождения строки str2 строкой str3.Функция возвращает указатель str1

Функцию, которая получает два параметра str1 и str2 типа string и возвращает позицию начала последнего появления str2 в str1
Напишите функцию rightposition, которая получает два параметра str1 и str2 типа string и возвращает позицию начала последнего появления...

16
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
12.07.2011, 17:37
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
main()
{
    int dlin1str, dlin2str, i;
    char str1[] = "CTPOKA";
    char str2[] = "String2. CTPOiKA";
    dlin2str = strlen(str2);
    dlin1str = strlen(str1);
    printf("%d %d\n", dlin1str, dlin2str);
        for(i = 0; i < dlin1str ; ++i)
            if(str2[dlin2str - dlin1str + i] != str1[i])
            {
                printf("!=");
                getch();
                break;
            }
    printf("==");
    getch();
}
поправил
функцию думаю сам напишешь

Добавлено через 2 минуты

Не по теме:

черт, задание неправильно прочитал, эта проверят только совпадает ли строка 1 с концом 2

0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 17:40
аргументы str1 str2 поменял местами
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h> //strlen
 
int strend(const char* str1, const char* str2)
{
    if (str1 == NULL || str2 == NULL)
        return -1;
 
    unsigned len = strlen(str2);
    const char *p1 = &str1[strlen(str1) - 1], 
               *p2 = &str2[len - 1];
    while (*p1-- == *p2-- && len--);
 
    return !len;
}
 
int main()
{
    printf("%d\n",strend("String2. TPOKA", "CTPOKA"));
    printf("%d\n",strend("String2. СTPOKA", "CTPOKA"));
    getchar();
    return 0;
}
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
12.07.2011, 17:43
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
main()
{
    int dlin1str, dlin2str, i;
    char str1[] = "CTPOKA";
    char str2[] = "String2. CTPOiKA";
    dlin2str = strlen(str2);
    dlin1str = strlen(str1);
    printf("%d %d\n", dlin1str, dlin2str);
        for(i = 1; i <= dlin1str ; ++i)
            if(str2[dlin2str - i] != str1[dlin1str - i])
                printf("!=");
            else 
                printf("==");
    getch();
}
поправил, при условии, что 1-я строка самая маленькая
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.07.2011, 17:45
И никто даже не думает убедиться, что строка 1 не длиннее строки 2

Добавлено через 53 секунды
soon, эх, вовремя ввернул про условие
0
 Аватар для ZiGSuN
27 / 27 / 7
Регистрация: 02.12.2009
Сообщений: 66
12.07.2011, 17:45
C++
1
2
3
4
5
6
bool STREND(string str1,string str2){
   if(str2.rfind(str1) ==(str2.size()-str1.size())) 
       return 1;
   else
       return 0;
}
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 17:47
grizlik78, поясни плиз)
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.07.2011, 17:48
ZiGSuN, а если str1 два раза входит в str2?

Добавлено через 1 минуту
Maxwe11, что? Если первая строка длиннее второй, то первая никак не может оказаться в конце второй.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 17:49
grizlik78, мой вариант это учитывает) я аргуменеты str1 && str2 поменял местами в функции
0
 Аватар для ZiGSuN
27 / 27 / 7
Регистрация: 02.12.2009
Сообщений: 66
12.07.2011, 17:50
ZiGSuN, а если str1 два раза входит в str2?
да действительно, подправил!
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.07.2011, 18:00
Maxwe11, что вернёт она в случае, если str1 = "abcd", а str2 = "bcd"? Я пока не проверял

Добавлено через 4 минуты
Ах, у тебя наоборот, вторая на вхождение в конец первой проверяется. Тогда да. Запутал ты меня

Добавлено через 3 минуты
Maxwe11, а русская C в твоём примере среди латинских букв, это тоже чтобы запутать?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 18:02
Цитата Сообщение от grizlik78 Посмотреть сообщение
Maxwe11, а русская C в твоём примере среди латинских букв, это тоже чтобы запутать?
угу, должен же ТС хоть чуток подумать)
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.07.2011, 18:18
Но в твоём случае, если вторая длиннее первой, то если первая совпадает с концом второй, то происходит выход за границу первой строки. Пусть и только для чтения, но всё-равно не хорошо. И остаётся небольшая вероятность неправильного ответа.

Добавлено через 10 минут
К тому же для одинаковых строк она даёт 0. А по-моему должна давать 1.
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 18:31
заплатка
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int strend(const char* str1, const char* str2)
{
    if (str1 == NULL || str2 == NULL)
        return -1;
 
    int len = strlen(str2);
    if (!len)
        return -1;
 
    const char *p1 = &str1[strlen(str1) - 1], 
               *p2 = &str2[len - 1];
    while (*p1 && *p1-- == *p2-- && len--);
 
    return !len;
}
в 1-м варианте при одинаковых строках len == -1 и unsigned становился на максимальным
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
12.07.2011, 18:41
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
    
// возвращает 1, если строка bigStr заканчивается строкой shortStr
int strend(const char * bigStr, const char * shortStr){
    int bigLen, shortLen;
    return ( bigStr && shortStr && ( bigLen = strlen(bigStr) ) >= ( shortLen = strlen(shortStr) ) )
        ? ! ( strcmp(bigStr + bigLen - shortLen, shortStr) ) : 0;
}
 
int main(void){
    char bigStr[BUFSIZ], shortStr[BUFSIZ];
    
    while ( printf("Big string: ") && scanf("%[^\n]%*c", bigStr) == 1
        && printf("Short string: ") && scanf("%[^\n]%*c", shortStr) == 1 )
            printf("Big string %sends with short string.\n", ( strend(bigStr, shortStr) ) ? "" : "not ");
    
    return 0;
}
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.07.2011, 02:39
Maxwe11, я вредный, я знаю
Но вот тестик (для заплатки).
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
    char const * str = "abcde";
    char const * str1 = str + 1;
    char const * str2 = str;
    printf("str1: %s\nstr2: %s\n", str1, str2);
    printf("%d\n",strend(str1, str2));
    str1 = str;
    str2 = str+1;
    printf("str1: %s\nstr2: %s\n", str1, str2);
    printf("%d\n",strend(str1, str2));
    str1 = "bcde";
    str2 = "abcde";
    printf("str1: %s\nstr2: %s\n", str1, str2);
    printf("%d\n",strend(str1, str2));
    str1 = "abcde";
    str2 = "bcde";
    printf("str1: %s\nstr2: %s\n", str1, str2);
    printf("%d\n",strend(str1, str2));
 
    return 0;
}
У меня результат такой:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
$ ./a.out  
str1: bcde
str2: abcde
1
str1: abcde
str2: bcde
0
str1: bcde
str2: abcde
0
str1: abcde
str2: bcde
1
Добавлено через 7 часов 56 минут
Что-то я критиковал, критиковал, а своего так и не показал В общем ещё вариантик.
C
1
2
3
4
5
6
7
8
9
10
11
12
int strend(const char * bigStr, const char * shortStr){
    const char *ptr1 = bigStr, *ptr2 = shortStr;
    while (*ptr1)
        ++ptr1;
    while (*ptr2)
        ++ptr2;
    while (ptr1 != bigStr && ptr2 != shortStr && *--ptr1 == *--ptr2)
        ;
    if (ptr2 != shortStr)
        return 0;
    return *ptr1 == *ptr2;
}
1
13.07.2011, 02:47

Не по теме:

Цитата Сообщение от grizlik78 Посмотреть сообщение
Что-то я критиковал, критиковал,
правильно делали, открыли мне глаза на тестирование), мне и в голову не приходило тестирование с разными указателями на одну и ту же строку

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2011, 02:47
Помогаю со студенческими работами здесь

Выдать 1, если строка t расположена в конце строки s, и нуль в противном случае
Добрый вечер. Нужно, используя указатели написать функцию strend(s,t), которая выдает 1, если строка t расположена в конце строки s, и нуль...

Написать и протестировать функцию STR_CMP(str1,str2)
добрый день... очень нужна помощь... Написать и протестировать функцию STR_CMP(str1,str2), которая сравнивает строки str1 и str2....

Написать и протестировать функцию STRS(str1, str2)
Здравствуйте. такая задача попалась: нужно написать программу которая определяет, встретился ли в строке str1 какой-нибудь символ из...

Функция: проверить, является ли строка str1 подстрокой строки str2
Доброго времени суток) кому не составит большого труда, прошу помочь с заданием) Написать функцию ISSUBSTR(str1,str2), которая выясняет,...

Заменить все вхождения str1 на str2 (str1 вводится из файла, а str2 - с клавиатуры)
заменить все вхождения подстроки str1 на подстроку str2; строка str1 вводится из файла, а строка str2 с клавиатуры {Ha C++}


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru