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