あなたの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
?どの場合でも重複した文字は削除されますか?もしそうなら、 'k = 2'と' k = 3'のケースが選択された答えに間違って表示されていますか?あなたの究極の目的が何であるかは不明であり、答えがそれを満たしているかどうかは不明です。 –