Пытаюсь переписать этот код, написанный на C++ в C (СИ)
Код делает следующее: читает str2 если находит * читает str1 от позиции * до ближайшей < потом прибавляет
Результат: Test_Value,564,Test_Value2,456,Test_Value3,123,
int main()
{
std::string make_string{};
std::string final_string{};
std::string str1("
i = str2.find('*', i + 1); // найти позицию следующей звезды if (i > str1.length()) // если звездочек больше нет, выйти из цикла break;
final_string += make_string + ','; //записать в основную строку и поставить запятую make_string.clear(); // очистить временную строку
count += 2; position = i + (final_string.length() - count); // вычисляем позицию для следующей итерации так: позиция следующей звездочки известна (20) прибавим длину записанных символов и вычтем * и ,
} final_string += make_string;
cout << final_string << endl; return 0; }
Переделал вот так для СИ.
#include
int main(void) { char *make_string = NULL; char *final_string = NULL;
char *str1[] = "
---> } memset(&make_string, '\0', sizeof(char*)); //make_string = ""; } strcat(final_string, make_string); //final_string += make_string; printf("%s
",final_string); return 0; }
Вопросы: ---> здесь нужно читать от позиции * до < в str1.
Как переместить указатель на туже позицию где он стоит в str2?
Ответ
#include
int main(void)
{
char *make_string = NULL;
char *final_string = NULL;
char str1[] = " Test_Value 564 Test_Value2 456 ";
char str2[] = "Test_Value3 123 * * * * ";
size_t i = 0;
size_t i2=0;
size_t str1_length=strlen(str1);
size_t str2_length=strlen(str2);
size_t final_string_length=0;
//указатель на * в str2
char *ptr2 = strchr(str2, '*');
//указатель на < в str1
char *ptr1=NULL;* *
size_t position = ptr2-str2;
size_t count = 0;
while (ptr2!=NULL) { // пока находится указатель на звёздочку в str2
//позиция *
i=ptr2-str2;
//ищем < в str1
if(position
printf("%s
",final_string);
//TODO: освободить память
free(make_string);
free(final_string);
return 0;
}
Более устойчивый к пробелам из первой и второй строки алгоритм:
#include
int main(void)
{
char *make_string = NULL;
char *final_string = NULL;
size_t final_string_length=0;
char str1[] = " Test_Value_Very_Big_Big_value_VALUE 564 Test_Value2 456 ";
char str2[] = "< tr > < th >* Test_Value3 123 * * * "; * *
size_t str1_length=strlen(str1);
size_t str2_length=strlen(str2);
size_t substr_length=0;
int more1_count=0;
int more2_count=0;
char *more1_last=NULL;//позиция последнего '>' в str1
char *less1=NULL;//позиция '<' в str1
int i2=0;//текущая позиция в str2
int i1=0;//текущая позиция в str1
size_t comma_length=0;
for(i2=0;i2
}
}
//добавляем последнюю запятую
final_string=(char*)realloc(final_string,final_string_length+1);
final_string[final_string_length]='\0';
final_string=strcat(final_string,",");
printf("%s
",final_string);
//TODO: освободить память
free(make_string);
free(final_string);
return 0;
}
Комментариев нет:
Отправить комментарий