Почему статический массив(символов) обрезается при копировании элементов?
Задание состоит в том, чтобы вставить между всеми единицами исходной строки нули, например, 11111 -> 101010101
#include <iostream>
#include <string.h>
#include <stdlib.h>
void Copy(char* strA, char* strB)
{
int i;
for (i = 0; i <= strlen(strA); i++)
{
strB[i] = strA[i];
}
}
void InsertZero(char* strA)
{
int k,m = 0;
while (int i=0 != strlen(strA))
{
if (strA[i] == '1' && strA[i + 1] == '1')
{
k = i+1;
for (k; k <= strlen(strA) - 2; k++)
{
strA[k + 1] = strA[k];
k++;
}
strA[i + 1] = '0';
}
i++;
}
}
int main()
{
char strNew[11];
char strMain[20];
printf("Vvedite stroku iz 10 cifr \n");
gets_s(strNew);
Copy(strNew, strMain);
InsertZero(strMain);
printf("Vasha novaya stroka \n");
puts(strMain);
}
Ответы (2 шт):
Можно и без лишних копирований...
int main()
{
char strNew[11];
char strMain[20];
printf("Vvedite stroku iz 10 cifr: ");
gets_s(strNew);
for(char * s = strNew, *t = strMain, d = 1;d;)
if ((d = (*t++ = *s++)) == '1')
if (*s == '1') *t++ = '0';
printf("Vasha novaya stroka %s\n",strMain);
}
Вообще правильное формирование строки - в ответе Harry. А у вас работает неправильно, потому что ошибки в функции InsertZero().
Во-первых у вас бесконечный цикл - на каждой итерации создается новая локальная переменная i, которая обнуляется и сравнивается с ненулевой длиной строки. Т.е. условие всегда истинно.
while (int i=0 != strlen(strA)) // бесконечный цикл
// должно быть
int i=0;
while ( i != strlen(strA))
В цикле for() вы всегда копируете данные от i+1 до размера строки -2. Размер строки у вас 10. Чтобы после первого символа вставить 0, нужно скопировать 10 символов ( 9 единиц и завершающий 0). А вы копируете от k==1 до k==8.
Т.е. когда вы вставляете символы строка должна увеличиваться.
for (k = i+1; k <= strlen(strA) - 2; k++) // слишком мало копируется
// должно быть
int m = strlen(strA);
for (k = i+1; k <= m; k++)
Кроме того, на каждой итерации вы увеличиваете счетчик на 2. Один раз в условии цикла, второй раз в теле
for (k; k <= strlen(strA) - 2; k++) // один раз увеличили
{
strA[k + 1] = strA[k];
k++; // второй раз увеличили
}
Вы копируете начиная с начала и до конца. Таким образом, вы затираете данные. Пока у вас строка только из единиц "1111111111" вам кажется что всё нормально. Но на самом деле если строка была бы "1123456789", то после первого копирования она бы стала "1111111111". Кроме того, если копировать именно количество символов, то последней единицей вы бы затерли 0 (11-ый символ - конец строки). Как вариант, можно заполнить массив strMain[] нулями - char strMain[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};.
Но вообще нужно копировать, начиная с конца. Сначала переставляете последний символ (конец строки), потом предпоследний и т.д.
for(int k = strlen(strA) + 2; k > i; k--)
strA[k] = strA[k-1];
Так работать будет, но в вашем алгоритме после каждой вставки производится копирование всего оставшегося содержимого, что очень не рационально.