В Visual Studio всё работает прекрасно, а при компиляции в c99 иногда появляется ошибка сегментации
Требуется исключить из строки каждое K-ое слово и повторяем каждое M-ое слово.
Ошибка появляется, например, при:
Enter the string 1 2 3 1 2 3 Enter K, M 2 2 Ошибка сегментирования
Visual Studio:
Enter the string 1 2 3 1 2 3 Enter K, M 2 2 "1 3 2"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* get_str() {
char buf[160] = { 0 };
char* res = NULL;
int len = 0, n = 0;
do {
n = scanf("%159[^\n]", buf);
if (n < 0) {
if (!res) {
return NULL;
}
}
else if (n > 0) {
int chunk_len = strlen(buf);
int str_len = len + chunk_len;
res = realloc(res, str_len + 1);
memcpy(res + len, buf, chunk_len);
len = str_len;
}
else {
scanf("%*c");
}
} while (n > 0);
if (len > 0) {
res[len] = '\0';
}
else {
res = calloc(1, sizeof(char));
}
return res;
}
int main() {
printf("Enter the string\n"); //заполняем
char* str = NULL;
str = get_str(); //точно работает правильно
printf("Enter K, M\n");
int K, M;
scanf("%d", &K);
scanf("%d", &M);
char** astr = NULL; //массив слов
astr = calloc(strlen(str) + 1, sizeof(char));
int len = 0;
char* bufs = calloc((strlen(str) + 1), sizeof(char)); //закидываем каждое слово в отдельную ячейку
for (int i = 0, j = 0; i <= strlen(str); i++) {
for (j = strlen(str); j > 0; j--) bufs[j] = 0;
while ((str[i] != ' ') && (str[i] != '\0')) {
bufs[j] = str[i];
j++;
i++;
}
astr[len] = calloc(strlen(bufs) + 1, sizeof(char));
strcat(astr[len], bufs);
strcat(astr[len], "\0");
len++;
}
for (int i = 0, j = 1; i < len; i++, j++) { //удаляем каждое K
if (j == K) {
astr[i] = NULL;
j = 0;
}
}
int m = 1;
for (int i = len - 1, j = len - 1; i >= 0; i--, j--) { //удаляем каждое M
while ((j != 0) && (astr[i] != NULL)) {
j--;
if ((astr[j] != NULL) && (strcmp(astr[i], astr[j]) == 0)) {
m++;
}
}
if (m % M == 0) astr[i] = NULL;
m = 1;
j = i;
}
printf("\"");
for (int i = 0, j = len - 1; i < len; i++) {
if (astr[i] != NULL) {
printf("%s", astr[i]);
while ((j >= 0) && (j > i)) {
if (astr[j] != NULL) {
printf(" ");
j = len - 1;
break;
}
j--;
}
}
}
printf("\"\n");
return 0;
}
char** astr = NULL; astr = calloc(strlen(str) + 1, sizeof(char)); - требуется указатель
char** astr = NULL; astr = calloc(strlen(str) + 1, sizeof(*char));
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
я только начинаю свой путь в С++ поэтому задался таким вопросом как : Стоит ли вообще использовать auto в указании переменой или же лучше указывать...
Пишу на C++, в качестве IDE использую CLion, однако, он слишком громоздкий для домашнего использования на старом ноуте, и я в данный момент пробую...
Задача: заменить std::thread немного схожим по логике (собственно написанным) классом-оберткой WinAPI ThreadОсновная проблема связана с конструктором...
сегодня я решил попробовать написать шифрование строк и у меня даже получилосьОднако в выводе расшифрованной строки присутствуют лишние...