C/C++

Переписать код на С

По индивидуальному заданию создать программу для обработки символьных строк. За образец брать библиотечные функции обработки строк языка C, но не применять их в своей программе. Предусмотреть обработку ошибочных ситуаций. Разработать два варианта заданной программы:
1) используя традиционную обработку массивов
2) используя адресную арифметику.

Задание.
Действие: вставка в строку s подстроки s1, начиная с позиции n

Написал программы, но не получается то, что требуется.
Код 1.
 #include  
#include

void ins(char* s, char* s1, int t)
{
char tmp[1000];
int i, j;
for (i = t, j = 0; i < 1000; i++, j++) {
tmp[j] = s[i];
}
for (i = t, j = 0; i < 1000; i++, j++)
s[i] = s1[j];
for (i = (t + strlen(s1)), j = 0; i < 1000; i++, j++)
s[i] = tmp[j];
}

int main()
{
char s[1000], s1[1000];
for (int i = 0; i < 1000; i++)
s[i] = '\0';
int n;
printf("vvedite s\n");
gets_s(s, 1000);
printf("vvedite s1\n");
gets_s(s1, 1000);
printf("vvedite n\n");
scanf_s("%d", &n);
ins(s, s1, n);
printf("%s\n", s);
return 0;
}
Код 2.

 #include  
#include

char* dob(char* s, char* s1, int k) {
int lenS = strlen(s);
int lenS1 = strlen(s1);
memmove(s + k + lenS1, s + k, lenS - k + 1);
memcpy(s + k, s1, lenS1);
return s;
}

int main() {
int k;
char s[1000];
char s1[1000];
printf("vvedite s=");
gets_s(s, 1000);
printf("vvedite s1=");
gets_s(s1, 1000);
printf("vvedite k=");
scanf_s("%d", &k);
printf("%s\n", dob(s, s1, k));

return 0;
}
 #include  
#include
#include
#define BUFFER 0x40
size_t length(const char* str) {
size_t i = 0;
while (str[i]) ++i;
return i;
}
void concat(char* dest, const char* src, size_t n) {
size_t i = length(dest);
size_t j = 0;
while (j < n) {
dest[i] = src[j];
++i;
++j;
}
dest[i] = 0;
}
void strclear(char* str) {
size_t i = 0;
do str[i] = 0; while (++i < BUFFER);
}
void insert(char* str, const char* substr, size_t n) {
char head[BUFFER] = { 0 };
char tail[BUFFER] = { 0 };
assert(length(str) + length(substr) - 1 < BUFFER);
concat(head, str, n);
concat(tail, str + n, length(str) - n);
strclear(str);
concat(str, head, length(head));
concat(str, substr, length(substr));
concat(str, tail, length(tail));
}
int main(void) {
char str[BUFFER] = { 0 };
char substr[BUFFER] = { 0 };
size_t n = 0;
system("chcp 1251 > nul");
printf("Введите строку: ");
gets_s(str, BUFFER);
printf("Введите подстроку: ");
gets_s(substr, BUFFER);
printf("Введите позицию для вставки: ");
scanf_s("%zu", &n);
insert(str, substr, n);
printf("Изменённая строка: %s\n", str);
system("pause > nul");
return 0;
}
 #include  
#include
#include
#define BUFFER 0x40
size_t length(const char* str) {
const char* ptr = str;
while (*ptr) ++ptr;
return ptr - str;
}
void concat(char* dest, const char* src, size_t n) {
char* last = dest + length(dest);
const char* beg = src;
const char* end = src + n;
while (beg != end) *last++ = *beg++;
*last = 0;
}
void strclear(char* str) {
char* beg = str;
char* end = str + BUFFER;
do *beg = 0; while (++beg != end);
}
void insert(char* str, const char* substr, size_t n) {
char head[BUFFER] = { 0 };
char tail[BUFFER] = { 0 };
assert(length(str) + length(substr) - 1 < BUFFER);
concat(head, str, n);
concat(tail, str + n, length(str) - n);
strclear(str);
concat(str, head, length(head));
concat(str, substr, length(substr));
concat(str, tail, length(tail));
}
int main(void) {
char str[BUFFER] = { 0 };
char substr[BUFFER] = { 0 };
size_t n = 0;
system("chcp 1251 > nul");
printf("Введите строку: ");
gets_s(str, BUFFER);
printf("Введите подстроку: ");
gets_s(substr, BUFFER);
printf("Введите позицию для вставки: ");
scanf_s("%zu", &n);
insert(str, substr, n);
printf("Изменённая строка: %s\n", str);
system("pause > nul");
return 0;
}
Андрей Пушкарев
Андрей Пушкарев
75 410
Лучший ответ