2 / 3 / 3
Регистрация: 02.11.2010
Сообщений: 129
1

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

12.07.2011, 17:20. Показов 3637. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.07.2011, 17:20
Ответы с готовыми решениями:

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

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

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

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

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

Решение

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
Каратель
Эксперт С++
6608 / 4027 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 17:40 3
аргументы 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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
12.07.2011, 17:43 4
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
Эксперт С++
2378 / 1662 / 279
Регистрация: 29.05.2011
Сообщений: 3,396
12.07.2011, 17:45 5
И никто даже не думает убедиться, что строка 1 не длиннее строки 2

Добавлено через 53 секунды
soon, эх, вовремя ввернул про условие
0
27 / 27 / 7
Регистрация: 02.12.2009
Сообщений: 66
12.07.2011, 17:45 6
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
Каратель
Эксперт С++
6608 / 4027 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 17:47 7
grizlik78, поясни плиз)
0
Эксперт С++
2378 / 1662 / 279
Регистрация: 29.05.2011
Сообщений: 3,396
12.07.2011, 17:48 8
ZiGSuN, а если str1 два раза входит в str2?

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

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

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

Добавлено через 10 минут
К тому же для одинаковых строк она даёт 0. А по-моему должна давать 1.
1
Каратель
Эксперт С++
6608 / 4027 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
12.07.2011, 18:31 14
заплатка
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Эксперт С++
11886 / 7259 / 1720
Регистрация: 25.07.2009
Сообщений: 13,279
12.07.2011, 18:41 15
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
Эксперт С++
2378 / 1662 / 279
Регистрация: 29.05.2011
Сообщений: 3,396
13.07.2011, 02:39 16
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;
}
У меня результат такой:
Код
$ ./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
Jupiter
13.07.2011, 02:47     Написать функцию, которая возвращает 1, если строка str1 расположена в конце строки str2
  #17

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2011, 02:47

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru