Вызов функции с передачей указателей на два массива - C (СИ)
Формулировка задачи:
Всем привет, помогите найти ошибку. Суть, из функции main() вызывается функция int test(char* v, char* c) и ей передаётся два указателя на массивы из функции test вызывается функция int strend(char* s, char* t) и её передается два указателя, Идея заключается в том что strend возвращает результат в test, а он в main(). В результате компилируется запускается и вылетает критическая ошибка.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <vector>
using namespace std;
//char* str_in(char*);
int strend(char*, char*);
int test(char*, char* );
int main()
{
char *s="Test";
char *t="st";
test(s,t);
//....
//....
getch();
return 0;
}
/*-------------------------------------------------------*/
int test(char* s, char* t){
//....
//....
strend(s,t);
//....
//....
return 0;
}
/*-------------------------------------------------------*/
int strend(char* s, char* t)
{
strrev(s);
strrev(t);
if(strstr(s,t)!=0)
{
strrev(s);
strrev(t);
return 1;
}
else
{
strrev(s);
strrev(t);
return 0;
}
}
Да чуть не забыл, ответить на коменты смогу только вечером.
Решение задачи: «Вызов функции с передачей указателей на два массива»
textual
Листинг программы
int strend(char *s, char *t)
{
char *ps, *pt;
char *es, *et;
int ls, lt;
for (es=s; *es!=0; ++es);
for (et=t; *et!=0; ++et);
ls=es-s;
lt=et-t;
if (ls<lt)
{
return 0;
}
for (ps=es-1, pt=et-1; (ps>=s)&(pt>=t); --ps, --pt)
{
if (*ps!=*pt)
{
return 0;
}
}
return 1;
}
Объяснение кода листинга программы
В данном коде представлена функция strend, которая принимает два указателя на строки (s и t). Она сравнивает эти строки, подсчитывая их длины и проводя поэлементное сравнение символов до тех пор, пока не встретит различия или не дойдет до конца одной из строк. Если строки являются одинаковыми, функция возвращает 1, в противном случае - 0.
Список действий в коде можно представить следующим образом:
- Инициализация переменных:
char *ps,char *pt- указатели на символы строкsиtchar *es,char *et- указатели на последний символ строкsиtint ls,int lt- переменные для хранения длин строкsиtint i- счётчик для цикла
- Определение длины строк
sиt:- Цикл
forс переменнойes=sи условием*es!=0для определения последнего символа строкиs - Цикл
forс переменнойet=tи условием*et!=0для определения последнего символа строкиt
- Цикл
- Вычисление разницы между указателями на последний символ строки
sиt:ls=es-slt=et-t
- Проверка условия для возврата значения:
- Если
ls<lt- возврат 0, так как строкаsкороче строкиt
- Если
- Цикл
forдля сравнения символов строкsиt:- Переменные
ps=es-1иpt=et-1перед началом цикла - Условие для цикла
(ps>=s)&(pt>=t)для продолжения цикла, покаpsиptбольше или равны начальным адресам строкsиt - В каждой итерации цикла сравниваются символы, на которые указывают
psиpt - Если символы не совпадают, возврат 0
- Переменные
- Возврат 1, если цикл завершен и все символы строк совпадают.