Я новичок в C с некоторым опытом работы с Python и Java. Я хочу решить проблему с C. Проблема выглядит следующим образом:
Возьмите ввод как предложение со словами, разделенными только пробелами (только в нижнем регистре), перепишите предложение со следующими правилами:
1) Если слово встречается в первый раз, оставьте его таким же.
2) Если слово встречается дважды, замените второе вхождение словом, которое копируется дважды (например, два --> twotwo).
3) Если слово встречается три раза или более, удалите все вхождения после второго.
Распечатайте вывод как предложение. Максимальная длина входного предложения и каждого отдельного слова составляет 500 символов и 50 символов.
Примерный ввод: jingle bells jingle bells весь путь jingle
Примерный вывод: jingle bells jinglejingle bells всеway
Подход, который я выбрал:
1) Прочитать ввод, отделить каждое слово и поместить их в массив указателей символов.
2) Использовать вложенный цикл forпройти через массив. Для каждого слова после первого слова:
A - If there is no word before it that is equal to it, nothing happens.
B - If there is already one word before it that is equal to it, change the word as its "doubled form".
C - If there is already a "doubled form" of itself that exists before it, delete the word (set the element to NULL.
3) Вывести измененный массив.
Я довольно уверен в правильности этого подхода. Однако, когда я на самом деле написал код:
'' '
int main()
{
char input[500];
char *output[500];
// Gets the input
printf("Enter a string: ");
gets(input);
// Gets the first token, put it in the array
char *token = strtok(input, " ");
output[0] = token;
// Keeps getting tokens and filling the array, untill no blank space is found
int i = 1;
while (token != NULL) {
token = strtok(NULL, " ");
output[i] = token;
i++;
}
// Processes the array, starting from the second element
int j, k;
char *doubled;
for (j = 1; j < 500; j++) {
strcpy(doubled, output[j]);
strcat(doubled, doubled); // Create the "doubled form"
for (k = 0; k < j; k++) {
if (strcmp(output[k], output[j]) == 0) { // Situation B
output[j] = doubled;
}
if (strcmp(output[k], doubled) == 0) { // Situation C
output[j] = ' ';
}
}
}
// Convert the array to a string
char *result = output[0]; // Initialize a string with the first element in the array
int l;
char *blank_space = " "; // The blank spaces that need to be addded into the sentence
for (l = 1; l < 500; l++) {
if (output[l] != '\0'){ // If there is a word that exists at the given index, add it
strcat(result, blank_space);
strcat(result, output[l]);
}
else { // If reaches the end of the sentence
break;
}
}
// Prints out the result string
printf("%s", result);
return 0;
}
' ''
, я выполнил несколько тестов для каждого отдельного блока. Есть несколько проблем:
1) При обработке массива strcmp, strcat и strcpy в цикле, похоже, выдают сообщения об ошибках сегментации.
2) При печати массива словане показывал порядок, который они должны делать.
Теперь я разочарован, потому что кажется, что все проблемы происходят из-за некоторых внутренних структурных дефектов моего кода, и они очень тесно связаны с механизмом памятиС, с которым я не очень знаком. Как мне это исправить?