2016-08-19 5 views
0

Я хочу показать предложение с k буквами в каждой строке, а также удалить повторяющиеся буквы из строки в целом. Я успел написать на новую строку, все длины слова К с этим кодомКак удалить повторяющиеся буквы из строки в c?

void subSent(char str[],int k) { 
    int MaxLe,i,j,h,z=0,Length, count; 
    char stOu[1000]={'\0'}; 

    Length=(int)strlen(str); 
    MaxLe=maxWordLength(str); 
    if((k>=1)&&(k<=MaxLe)) { 
     for(i=0;i<Length;i++) { 
      if((int)str[i]==32) { 
       j=i=i+1; 
      } else { 
       j=i; 
      } 

      for(;(j<i+k)&&(Length-i)>=k;j++) { 
       if((int)str[j]!=32) { 
        stOu[z]=str[j]; 
       } else { 
        stOu[z]=str[j+1]; 
       } 
       z++; 
      } 
      stOu[z]='\n'; 
      z++; 
     } 
    } 
} 

Но я борюсь с той частью, что необходимо сохранить только один раз слова. , например Строка = имеют хороший день и к = 1 я должен напечатать H В Е Н Я С D Y

Благодаря передовой!

+0

Что должен 'ПРИЯТНОГО DAY' и' к = 2' (или 'K = 3') выглядит? Удалены ли дублирующие письма в каждом случае? Если да, являются ли случаи, когда 'k = 2' и' k = 3' указаны неправильно в выбранном ответе? Неясно, какова ваша конечная цель, и неясно, удовлетворяет ли предоставленный ответ. –

ответ

0

Ваша процедура subSent() создает несколько проблем: во-первых, она не возвращает и не печатает результат - вы можете видеть ее только в отладчике; второй он вызывает maxWordLength(), который вы не предоставили.

Хотя избежать дублирования может быть сложным, в случае вашего алгоритма это не сложно. Поскольку все ваши слова фиксированной длины, мы можем ходить по выходной строке с новым словом, буквой k (плюс символом новой строки) за раз, делая strncmp(). В этом случае новое слово - это последнее добавленное слово, поэтому мы уходим, когда встречаются указатели.

Я переработал ваш код ниже и добавил процедуру устранения дублирования. Я не знал, что делает maxWordLength() так что я просто псевдонимов его strlen(), чтобы получить вещи работает:

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

#define maxWordLength strlen 

// does the last (fixed size) word in string appear previously in string 
bool isDuplicate(const char *string, const char *substring, size_t n) { 
    for (const char *pointer = string; pointer != substring; pointer += (n + 1)) { 
     if (strncmp(pointer, substring, n) == 0) { 
      return true; 
     } 
    } 

    return false; 
} 

void subSent(const char *string, int k, char *output) { 
    int z = 0; 

    size_t length = strlen(string); 
    int maxLength = maxWordLength(string); 

    if (k >= 1 && k <= maxLength) { 
     for (int i = 0; i < length - k + 1; i++) { 

      int start = z; // where does the newly added word begin 

      for (int j = i; (z - start) < k; j++) { 

       output[z++] = string[j]; 
       while (string[j + 1] == ' ') { 
        j++; // assumes leading spaces already dealt with 
       } 
      } 

      output[z++] = '\n'; 

      if (isDuplicate(output, output + start, k)) { 

       z -= k + 1; // last word added was a duplicate so back it out 

      } 

      while (string[i + 1] == ' ') { 
       i++; // assumes original string doesn't begin with a space 
      } 
     } 
    } 

    output[z] = '\0'; // properly terminate the string 
} 

int main() { 
    char result[1024]; 

    subSent("HAVE A NICE DAY", 1, result); 

    printf("%s", result); 

    return 0; 
} 

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

ВЫВОД

subSent("HAVE A NICE DAY", 1, result); 

H 
A 
V 
E 
N 
I 
C 
D 
Y 

subSent("HAVE A NICE DAY", 2, result); 

HA 
AV 
VE 
EA 
AN 
NI 
IC 
CE 
ED 
DA 
AY 

subSent("HAVE A NICE DAY", 3, result); 

HAV 
AVE 
VEA 
EAN 
ANI 
NIC 
ICE 
CED 
EDA 
DAY 
+0

Почему вы печатаете полную строку, включая повторяющиеся символы, в случаях с символом «2» и «3»? Разве они не должны быть сделаны с дублирующимися буквами, удаленными из строки, или я просто пропущу точку? например * "удалить повторяющиеся буквы из строки в целом." * ?? –

+0

@ DavidC.Rankin, я понимаю вашу точку зрения. Я прочитал его проблему как удаление повторяющихся слов длины K из результата. Хотя в этом вопросе говорится «письма», это похоже на изменения других. Я зацепился за «борьбу с частью, которая должна сэкономить только одно время слова».) Таким образом, «DONT MISS MISSISSAUGA» выводит только одну «МКС» вместо трех с длиной ксерометра 3. Если OP подтверждает, помимо простого принятия, я могу соответствующим образом изменить вопрос. – cdlane

+0

Да, я читал хотя вопрос и ответ и пытался решить все проблемы, и они просто не все соответствовали. Кто знает. Похоже, вы заставили его подтолкнуть в правильном направлении, поскольку больше не было ответа. Отличная работа. –

Смежные вопросы