2015-01-12 2 views
0

Я хочу написать функцию, которая получает предложение (я называю это resentence) и найти дублированные слова и удалить их. например: входудалить дублированные слова в строке в c программе

Big happy happy smile 

выход

Big happy smile 

Это показывает, что ошибка в строке:

if (strstr(temp1, temp) == NULL) 

надежда кто-то может найти то, что сделка.

void RemoveDuplicates(char *resentence) 
{ 
char *temp1 = malloc(100); 
char *temp = NULL; 
int len; 
len = strlen(resentence); 
printf("len:%d", len); 
temp = strtok(resentence, " "); 


if (temp != NULL && strstr(temp1, temp) == NULL) 
    strcpy(temp1, temp); 

while (temp != NULL) 
{ 
    temp = strtok(NULL, " "); 

    if (strstr(temp1, temp) == NULL) 
    { 
     strcat(temp1, " "); 
     strcat(temp1, temp); 
    } 
} 
strcpy(resentence,temp1); 
puts(resentence); 
free(temp1); 
} 
+1

Какое сообщение об ошибке? –

+0

Необработанное исключение в 0x5DEA49CE (msvcr120d.dll) в файле q1.exe: 0xC0000005: Место чтения нарушения доступа 0x00000000. Я предполагаю, что есть ошибка памяти –

+2

первый раз «temp1» указывает на неинициализацию области. 'char * temp1 = malloc (100);' -> 'char * temp1 = calloc (100, 1);' или 'char * temp1 = malloc (100); * temp1 = 0;' – BLUEPIXY

ответ

1

попробовать это

void RemoveDuplicates(char *resentence){ 
    char *temp1 = malloc(100); 
    char *temp = NULL; 

    *temp1=0; 
    temp = strtok(resentence, " "); 

    if (temp != NULL){// && strstr(temp1, temp) == NULL) 
     strcpy(temp1, temp); 
     while ((temp = strtok(NULL, " ")) != NULL){ 
      if (strstr(temp1, temp) == NULL){ 
       strcat(temp1, " "); 
       strcat(temp1, temp); 
      } 
     } 
    } 
    strcpy(resentence, temp1); 
    puts(resentence); 
    free(temp1); 
} 
+0

Спасибо, это работа! :) –

+0

@WhozCraig спасибо. я забыл изменения. – BLUEPIXY

0

На самом деле, если вы вводите что-то вроде этого: «а абы» в этом коде, даже в исправленной версии он все еще будет давать неверный вывод, в этом case: "abc" (отсутствует "ab"). Это происходит из-за того, как работает функция strstr(). Он принимает две строки, позволяет предположить char * a = "abc" и char * b = "ab", и сравнивает их друг с другом символом по символу. С строками a и b это будет выглядеть так: 1) a = a (ok), 2) b = b (ok), и здесь он останавливается после того, как «strstr()» не сравнивает символ нулевого терминатора '\ 0', позволяющий нас с ложным подтверждением равенства. Ниже приводится небольшая программа, которую я написал для этой же цели, и, похоже, работает с любым данным вводом (по крайней мере, с теми, которые я пробовал:]), надеюсь, что это помогает.

#include <stdio.h> 
#include <string.h> 

#define SIZE 500 

void duplicateRemover(char *, const int); 

int main(void) 
{ 
    char someString[SIZE]; 

    puts("Enter text: "); 
    fgets(someString, SIZE, stdin); 

    someString[strcspn(someString, "\n")] = 0; 

    printf("\n\n%s\n\n", "Text without repeated words: "); 
    duplicateRemover(someString, SIZE); 
} 

void duplicateRemover(char *arrayPtr, const int sizeP) 
{ 
    char wordTable[sizeP][sizeP], *tokPtr; 
    size_t i, j, k, l; 

    tokPtr = strtok(arrayPtr, " "); 

    strcpy(wordTable[0], tokPtr); 

    for(i = 1; (tokPtr = strtok(NULL, " ")) != NULL; i++) 
     strcpy(wordTable[i], tokPtr); 

    for(j = 0; j <= i; j++) 
     for(k = j + 1; k <= i; k++) 
      if(strcmp(wordTable[j], wordTable[k]) == 0) { 
       for(l = k; l < i; l++) 
        strcpy(wordTable[l], wordTable[l + 1]); 
      k = j; 
      i--; 
      } 

    for(l = 0; l <= i; l++) 
     printf("%s ", wordTable[l]); 
} 
Смежные вопросы