Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2016, 13:31   #1
Vitami
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 18
По умолчанию Помогите, нужно исправить код программы на СИ!!!

Нужно ввести строку и каждое слово из строки записать в отдельную ячейку массива. Пытался сделать, но программа не работает как нужно.
Код:
#include <stdio.h> 
#include <iostream> 

void konvert(char a[], char b[])
{
	int j = 0;
	for (int i = 0; a[i] != '\0'; i++)
	{
		if(a[i]!=' ')
		{
			for (i; a[i] != ' '; i++)
			{
				b[j] = b[j] + a[i];
			}//for
			j++;
		}//if
	}//for
        for (int i = 0; i < j; i++)
	{
		printf("%c", b[i]);
		printf(" ");
	}//for
}//konvert

int main()
{
	char stroka[100] = {' '};
	char strSl[100] = { ' ' };
	printf("Vvedite stroku:");
	scanf("%[^\n]s", &stroka);
	konvert(stroka, strSl);
	free(strSl);
	system("pause");
	return 0;
}//main
Можно пользоваться только стандартными библиотеками!

Последний раз редактировалось Vitami; 13.11.2016 в 13:35.
Vitami вне форума Ответить с цитированием
Старый 13.11.2016, 14:03   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Так ты же не в массив строк переводишь, а в строку.

И да, не нужно освобождать переменные на стеке.
Цитата:
Сообщение от Vitami Посмотреть сообщение
free(strSl);
А так, наверно, стоит сделать так:

Код:
inline BOOL is_delimeter(const char c){
   return c==' ' || c == '\t' || c == '\n';
}
char*[] split(const char* text, size_t& result_size)
{
    // Выделяем память под промежуточный результат
    // размер - длина строки (очевидно, что слов в строке меньше, чем длина строки)
    // В принципе, размер можно делить смело на два, но я этого не сделал.
    // строки - это указатели на первый символ строки, поэтому умножаем на размер указателя
    char*[] temporary = (char*[])malloc(strlen(text)*sizeof(void*));
    size_t res_size = 0; // реальный размер итогового массива
    // Берём указатель на самый левый символ
    char* left = text;
    char* right;
    // Все строки заканчиваются нулём, поэтому пробегаем по строке, пока не натыкаемся на символ, равный нулю
    while(*left){
        // Здесь пропускаем все пробельные символы
        // ++ к указателю переходит на следующий символ
        while(*left && is_delimeter(*left)){
           left++;
        }
        // Мы нашли первый символ слова или же конец.
        // теперь точно так же ищем уже новый пробел
        right = left;
        while(*right && !is_delimeter(*right)){
            right++;
        }
        // Если левый указатель показывает на символ, а не на конец строки
        if(*left){
             // Выделяем память - длина слова + 1 на символ окончания строки
             temporary[res_size] = (char*)malloc(rigth-left+1);
             // копируем память начиная с указателя left, размером с длину слова
             memcpy(temporary[res_size], left, right - left);
             // добавляем в конец новой строки символ окончания строки
             temporary[res_size][rigth-left] = 0;
             // Запоминаем, что размер увеличился
             res_size++;
        }
        // Ищем следующее слово - перемещаем левую границу к правой
        left = right;
    }
    // мы знаем, сколько нам на самом деле нужно памяти для результата
    // поэтому копируем данные в новый массив
    char*[] result =  (char*[])malloc(res_size*sizeof(void*));
    memcpy(result, temporary, res_size);
    result_size = res_size; // запоминаем размер в параметре, переданном по ссылке
    free(temporary); // временный массив чистим
    return result;
}
Никогда не писал на C, поэтому не уверен, что правильно, код не запускал, могут быть ошибки.

split возвращает массив строк, в аргументе result_size размер получившегося массива.
a.k.a. Angelicos Phosphoros
Мой сайт

Последний раз редактировалось New man; 13.11.2016 в 14:47.
New man вне форума Ответить с цитированием
Старый 13.11.2016, 14:09   #3
Vitami
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
Так ты же не в массив строк переводишь, а в строку.

И да, не нужно освобождать переменные на стеке.


А так, наверно, стоит сделать так:

Код:
inline BOOL is_delimeter(const char c){
   return c==' ' || c == '\t' || c == '\n';
}
char*[] split(const char* text, size_t& result_size)
{
    char*[] temporary = (char*[])malloc(strlen(text)*sizeof(void*));
    size_t res_size = 0;
    char* left = text;
    char* right;
    while(left){
        while(left && is_delimeter(*left)){
           left++;
        }
        right = left;
        while(right && !is_delimeter(*right)){
            right++;
        }
        if(*left){
             temporary[res_size] = (char*)malloc(rigth-left+1);
             memcpy(temporary[res_size], left, right - left);
             temporary[res_size][rigth-left] = 0;
             res_size++;
        }
        left = right;
    }
    char*[] result =  (char*[])malloc(res_size*sizeof(void*));
    memcpy(result, temporary, res_size);
    result_size = res_size;
    free(temporary);
    return result;
}
Никогда не писал на C, поэтому не уверен, что правильно, код не запускал, могут быть ошибки.

split возвращает массив строк, в аргументе result_size размер получившегося массива.
Если честно, то я практически ничего не понимаю, из того что тут написано((((((( Пока только осваиваю СИ
Vitami вне форума Ответить с цитированием
Старый 13.11.2016, 14:30   #4
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Добавил комментарии.

Использовать надо так:


Код:
   size_t length;
   char*[] words = split(str, length);
   ...
   for(size_t i = 0; i< length; i++){
     free(words[i]);
   }
   free(words);
В words будут слова, length - длина массива words
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, нужно исправить код программы на СИ!!!!!!!! Vitami Общие вопросы C/C++ 15 24.10.2016 00:31
Помогите, нужно исправить 4 ошибки в коде программы Dimas190597 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 02.10.2016 15:57
нужно исправить код melkaya9112 Помощь студентам 1 09.12.2010 00:56