Задание из книги по теме "Указатели" на С(Си)
Задание из книги K&R звучит следующим образом:
Напишите функцию strend(s, t), которая выдает 1, если строка t расположена в конце строки s, и нуль в противном случае.
Вот мой вариант решения:
int strend(char *begin, char *end)
{
char *temp = end;
while(*begin++ != '\0')
{
while(*begin == *temp)
{
if(*begin++ == '\0' && *temp++ == '\0')
return 1;
else
temp = end;
}
}
return 0;
}
Пытался в блоке else менять temp на *temp и различные другие вариации указателей, но если и получалось как-то отладить, программа все равно работала с багами. Конкретно в таком виде она совсем не выполняет своей функции, хотя как по мне, логика верная. Помогите, пожалуйста.
Ответы (3 шт):
#include <stdio.h>
#include <string.h>
//создаем нашу функцию str_B - наша строка , str_E - последняя строка
int strend(char *str_B,char *str_E);
int main()
{
printf("%d\n",strend("Example","le"));//вызываем
}
int strend(char *str_B,char *str_E)
{
int count = 0;
// находим разницу между длинами первой и второй строки,
// а -1 для того чтобы правильно работала с индексами
int dif = strlen(str_B) - strlen(str_E) - 1;
for(int i = dif; i < strlen(str_B)-1;i++)// в нашем случаи ՝ от 4 до 7
{
if(str_B[i+1] == str_E[count])// проверяем равны ли каждая "последняя" буква
{
}else // а если нет то сразу возвращаем 0
{
return 0;
}
count++;
}
return 1;// если все в порядке возвращаем 1
}
Пожалуй, похожим решением будет такое (но оно неэффективное: O(n*m)): https://ideone.com/jjnsrT
#include <stdio.h>
int strend(const char *s, const char *t)
{
for (const char *p, *u; ; ++s)
{
p = s;
for (u=t; *u && *u==*p; ++u, ++p);
if (!*p) return !*u;
}
}
#define CHECK(s,t) printf("%-7s %-7s => %d\n", s, t, strend(s, t))
int main(void)
{
CHECK("abc", "c");
CHECK("a", "a");
CHECK("a", "ab");
CHECK("abc", "");
CHECK("", "");
CHECK("aaaaa", "aaab");
CHECK("", "q");
return 0;
}
abc c => 1
a a => 1
a ab => 0
abc => 1
=> 1
aaaaa aaab => 0
q => 0
Самым эффективным будет такой вариант: https://ideone.com/lVykU3 https://ideone.com/4P0jPf
#include <stdio.h>
#include <string.h>
#include <memory.h>
int strend(const char *s, const char *t)
{
size_t n = strlen(s), m = strlen(t);
return n >= m && !memcmp(s+n-m, t, m);
}
#define CHECK(s,t) printf("%-7s %-7s => %d\n", s, t, strend(s, t))
int main(void)
{
CHECK("abc", "c");
CHECK("a", "a");
CHECK("a", "ab");
CHECK("abc", "");
CHECK("", "");
CHECK("aaaaa", "aaab");
CHECK("", "q");
return 0;
}
Либо, если не использовать стандартные функции: https://ideone.com/W8odK1
#include <stdio.h>
#include <string.h>
int strend(const char *s, const char *t)
{
const char *p;
size_t n, m;
for (p=t; *p; ++p);
m = p - t;
for (p=s; *p; ++p);
n = p - s;
if (n < m)
return 0;
for (s += n - m; s != p; ++s, ++t)
if (*s != *t)
return 0;
return 1;
}
#define CHECK(s,t) printf("%-7s %-7s => %d\n", s, t, strend(s, t))
int main(void)
{
CHECK("abc", "c");
CHECK("a", "a");
CHECK("a", "ab");
CHECK("abc", "");
CHECK("", "");
CHECK("aaaaa", "aaab");
CHECK("", "q");
return 0;
}
abc c => 1
a a => 1
a ab => 0
abc => 1
=> 1
aaaaa aaab => 0
q => 0