Вызов функции с передачей указателей на два массива - 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
иt
char *es
,char *et
- указатели на последний символ строкs
иt
int ls
,int lt
- переменные для хранения длин строкs
иt
int i
- счётчик для цикла
- Определение длины строк
s
иt
:- Цикл
for
с переменнойes=s
и условием*es!=0
для определения последнего символа строкиs
- Цикл
for
с переменнойet=t
и условием*et!=0
для определения последнего символа строкиt
- Цикл
- Вычисление разницы между указателями на последний символ строки
s
иt
:ls=es-s
lt=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, если цикл завершен и все символы строк совпадают.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д