Мне нужно взять 3 строки, строку «стог сена», строку «иголка» и строку буфера.Я должен найти в строке сена последовательность, соответствующую строке иглы, и скопировать найденный результат (всю подстроку) из строки сена в буфер (не копировать строку иглы).
Затем я должен вернуть 1, если совпадающая последовательность в стоге сена найдена, и 0, если игла не найдена.
Это код драйвера:
#include "myprog.h"
#include <assert.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int myStrStr(char haystack[], char needle[], char buffer[]);
int main(){
char haystack[][20] = {"chocolate","vanilla","caramel","strawberry","banana","cherry"};
char needle[][20] = {"choc","lla","am","strawberry","na","terrible"};
char buffer[255];
printf("\n\t=========Testing myStrStr with '%s' and substring '%s'===========\n\n", haystack[0], needle[0]);
int result = myStrStr(haystack[0],needle[0],buffer);
assert(result == 1 && strcmp(needle[0], buffer) == 0);
printf("\n\t\t....Test Passed\n");
printf("\n\t=========Testing myStrStr with '%s' and substring '%s'===========\n\n", haystack[1], needle[1]);
result = myStrStr(haystack[1],needle[1],buffer);
printf("needle: %s, buffer: %s\n", needle[1], buffer );
assert(result == 1 && strcmp(needle[1], buffer) == 0);
printf("\n\t\t....Test Passed\n");
printf("\n\t=========Testing myStrStr with 'blueberry' and substring 'ueber'===========\n\n");
result = myStrStr(haystack[2],needle[2],buffer);
assert(result == 1 && strcmp(needle[2], buffer) == 0);
printf("\n\t\t....Test Passed\n");
printf("\n\t=========Testing myStrStr with 'strawberry' and substring 'strawberry'===========\n\n");
result = myStrStr(haystack[3],needle[3],buffer);
assert(result == 1 && strcmp(needle[3], buffer) == 0);
printf("\n\t\t....Test Passed\n");
printf("\n\t=========Testing myStrStr with 'banana' and substring 'na'===========\n\n");
result = myStrStr(haystack[4],needle[4],buffer);
assert(result == 1 && strcmp(needle[4], buffer) == 0);
printf("\n\t\t....Test Passed\n");
printf("\n\t=========Testing myStrStr with 'grapefruit' and substring 'terrible'===========\n\n");
result = myStrStr(haystack[5],needle[5],buffer);
assert(result == 0);
printf("\n\t\t....Test Passed\n");
}
Я должен написать свой код в .h файле.Ниже мой файл .h
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int myStrStr(char * haystack, char * needle, char * buffer)
{
char *hays,*nee;
hays=haystack;
nee=needle;
buffer[0]='\0';
char s=sizeof(buffer);
char *tempbuffer=(char *)malloc(s);
if(*hays=='\0' || *nee=='\0' )
{
printf("Haystack and Needle Cannot be Compared because Empty string cannot be compared\n");
return 0;
}
for(;*hays!='\0' ;hays++)
{
while(*hays==*nee && *hays!='\0' && *nee!='\0' )
{
*tempbuffer=*hays;
strcat(buffer,tempbuffer);
hays++;
nee++;
}
if(*nee!= '\0'&& *tempbuffer!= '\0')
{
nee=needle;
*buffer=NULL;
}
}
printf("%s\n",buffer);
if(*nee=='\0')
{ return 1; }
return 0;
}
При попытке выполнить следующее сообщение:
Assertion failed: result == 1 && strcmp(needle[0], buffer) == 0, file driver.c, line 35
РЕДАКТИРОВАТЬ:
Я внес следующие изменения в свойкод:
изменено char *tempbuffer=(char *)malloc(s);
на char tempbuffer[255];
удалено *buffer=NULL;
Сейчас программа частично выполняется.Для первой строки, т. Е. «Chocolate» и «choc», она печатает требуемую общую подстроку.
c
h
o
choc
....Test Passed
Проблема начинается, когда она должна напечатать общую подстроку из «vanilla» и «lla».Он по-прежнему печатает общую букву из обеих строк, но также печатает последнюю букву из предыдущей строки
c
l
l
lla
needle: lla, buffer: lla
....Test Passed
Как вы можете видеть, она печатает "c", которое является последним словом предыдущей строки "choc"
То же самое происходит для третьих строк, то есть "карамель" и "я", но здесь мое утверждение терпит неудачу
a
a
a
aam
needle: am, buffer: aam
Assertion failed: result == 1 && strcmp(needle[2], buffer) == 0, file assignment1.c, line 36, function main
Abort
Я не могу понять, почему это утверждение не удалось, а также почему последняя буквапредыдущей строки также копируется в следующую строку?