kasandra77 Ответов: 2

Как соединить / связать слова в строковом массиве, используя только один цикл?


у меня есть массив с n словами .. Я хочу прикрепить строки вместе .. например, если массив имеет следующие строки: "hello ""world""!! "я хочу, чтобы функция возвращала :" helloworld!! "любая помощь, как я могу сделать что-то подобное без рекурсии и только с одним циклом !! и я могу использовать только из библиотеки строк две функции strcpy и strlen !! любые идеи ! спасибо

Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * connect( char **words, int n )
{
    int length = 0;

    for ( int i = 0; i < n; i++ ) length += strlen( words[i] );

    char *s = malloc( length + 1 );

    int pos = 0;

    for ( int i = 0; i < n; i++ )
    {
        strcpy( s + pos, words[i] );
        pos += strlen( words[i] );
    }

    return s;
}

int main( void )
{
    char * s[] = { "Hello", " ", "World" };
    int x=(sizeof( s ) / sizeof( *s ));

    char *p = connect( s, x);

  //  puts( p );

    free( p );
}

PIEBALDconsult

Это работает? Какой результат вы получаете? Или вы просто пытаетесь упростить?
Лучше избегать вызова strlen так много раз, чем избегать цикла.

kasandra77

он работает отлично .. я получаю желаемый результат (hello world), но я хочу сделать то же самое, но использовать только один цикл в коде !

PIEBALDconsult

Должна ли она быть неизменной? :Д

kasandra77

вы имеете в виду под неизменяемым, что я не могу изменить этот массив ? если это то, что вы имеете в виду, то да ! я также не могу изменить массив, и это делает это очень трудным !

kasandra77

все равно спасибо ! к сожалению, я больше не могу задать этот вопрос, лол, всего 30 минут подъема .. но спасибо Вам за то, что вы мне помогли, это очень много значит

kasandra77

я думал о том чтобы сделать перераспределение но я вроде как застрял там лол

2 Ответов

Рейтинг:
8

RAMASWAMY EKAMBARAM

char *connect(char **words, int n)
{
	int i, reqlen = 0, writlen = 0;
	char *s = NULL;
	
	for(i = 0; i < n; i++)
	{
		reqlen += strlen(words[i]) + (i == 0 ? 1 : 0); // addl byte for terminating NULL needed only once 
		s = realloc(s, reqlen);    // add your own code to handle memory allocation failure
		writlen += sprintf(s + writlen, "%s", words[i]); // sprintf() returns count of characters written (excluding NULL)
	}
	return s;
}


Рейтинг:
19

PIEBALDconsult

char * connect( char **words, int n )
{
    int i = 0 ;

    for ( ; i < n ; i++ )
    {                  
      *(words [ i ] - 1) = ' ' ;
    }    

    return words [ 0 ];
}


:барсук:


kasandra77

я вызвал эту функцию со следующей основной функцией : int main( void )
{
char * s [] = {"Hello", " World" };
int x=(sizeof( s ) / sizeof( *s ));

char *p = connect( s, x);

printf ("\n%s\n", p);


бесплатно( p );
}

но он не работает над кодом prject .. он внезапно останавливается !

PIEBALDconsult

Я смог запустить его при компиляции с Borland C/C++, но не с GCC. Какой компилятор вы используете?

kasandra77

О я использую gcc в качестве компилятора :\

kasandra77

или я работаю с классическим проектов код также от затмения