Манипуляция строк (сравните две строки и скопируйте общую строку) - PullRequest
0 голосов
/ 17 июня 2019

Мне нужно взять 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

РЕДАКТИРОВАТЬ:

Я внес следующие изменения в свойкод:

  1. изменено char *tempbuffer=(char *)malloc(s); на char tempbuffer[255];

  2. удалено *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

Я не могу понять, почему это утверждение не удалось, а также почему последняя буквапредыдущей строки также копируется в следующую строку?

1 Ответ

1 голос
/ 17 июня 2019

Ваш код полон запретных и необычных вещей. Я перечислю несколько из них.

  1. Заголовочные файлы (.h) НЕ ДОЛЖНЫ распределять память. Нет объявлений переменных, нет кода C.
  2. assert() обычно используется для разных целей. В вашем коде, в зависимости от вашего намерения, if() должно быть достаточно.
  3. Весь код драйвера можно сделать короче и более читаемым, используя цикл for, для анализа всех значений массивов.
  4. char s=sizeof(buffer); совершенно не приветствуется. Функция получает указатель на char, а не на массив. Поэтому результат всегда X, независимо от того, что вы используете в драйвере (X зависит от размера указателя, архитектуры и компилятора, а не от размера массива).
  5. В myStrStr() вы смешиваете нестандартный for с while (трудно прочитать и быстро понять). Поскольку вы не знаете количество итераций с самого начала, лучше всего подойдет только while().
  6. В myStrStr() buffer[0]='\0'; является источником проблем, если buffer указывает на нераспределенную память.
  7. «Я должен написать свой код в .h файле.» Кто заставляет вас это делать? Это ОЧЕНЬ плохая практика по многим причинам.
  8. В основной файл вы не включаете файл .h.
  9. Вы должны использовать отступы и пустые строки, чтобы сделать код читабельным и понятным.
  10. В результате 4. tempbuffer слишком короткий / маленький, и вы переполняете буфер всякий раз, когда пишете какой-либо символ после первого.
  11. "because Empty string cannot be compared" Действительно? Почему?

Практично: постарайтесь решить как можно больше проблем.

  1. Заменить char * tempbuffer = (char *) malloc (s); с Темпбуфер [255]; (это размер buffer)

  2. Насколько я понимаю ваш код, tempbuffer на самом деле может быть простым char - без строки, без массива, без динамического выделения ...

  3. Нет необходимости делать strcat(buffer,tempbuffer); для каждого символа.

  4. *buffer=NULL; перезаписывает содержимое buffer в функции main().

  5. Используйте отладчик и пошагово пошагово настраивайте вещи.


EDIT

Эта строка:

  strcat(buffer,tempbuffer);

является источником серьезных проблем, поскольку содержимое tempbuffer может быть случайным. Вы не знаете, есть ли у вас ЛЮБОЙ «\ 0» внутри, поэтому strcat() может объединять всю вашу оперативную память - пока не достигнет «\ 0». Одним из решений является инициализация всех значений от tempbuffer до '\ 0' в начале функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...