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++; 
     } 
    } 
} 

と新しい文字列にすべてのK長の言葉 を書くために管理しかし、私は言葉の一つだけの時間を節約するために必要な部分で苦労しています。 例の文字列は=私は H V E N I高度に C D Y

おかげで印刷する必要がありNICE DAY 及びk = 1 を持っています!

+0

?どの場合でも重複した文字は削除されますか?もしそうなら、 '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; 
} 

OUTPUT `NICE DAY`と` K = 2 '(または `K = 3`)のように見ている必要があり何

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の長さの単語を削除するという問題を読んだ。質問は "手紙"と言いますが、それは他者の編集によるものと思われます。私は「単語を1回だけ保存する必要がある部分に苦労しています」)。「DONT MISS MISSISSAUGA」は3の代わりに1の「ISS」を出力します。 OPは簡単な承認を超えて、それに応じて質問を編集できることを確認します。 – cdlane

+0

はい、私は質問と回答を読んでいて、すべての問題を解決しようとしていましたが、すべてに合っていませんでした。知るか。それ以上の反応がないので、正しい方向に彼を押し込んだように見えます。よくやった。 –

関連する問題