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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2015, 18:31   #1
sswt
Пользователь
 
Регистрация: 02.09.2015
Сообщений: 14
По умолчанию Функция, которая на вход принимает строку и в качестве результата возвращает ее копию

Нужно написать функцию на Си , которая на вход принимает строку и в качестве результата возвращает ее копию так, чтобы в ней не было гласных английских букв и точки с запятой.
Результат не правильный. Где я налажала?
Код:
unsigned StrCopy( const char* inStr)
{
    char * sDistionary = "eyuioa;";
    int* outStr = (int*)malloc(sizeof(int));
    for (; *inStr != '\0'; ++inStr)
    if (*inStr == *sDistionary)
    {
        *outStr = *inStr;
        ++outStr;
    }
 
    return *outStr;
 
}

Последний раз редактировалось Stilet; 22.09.2015 в 18:39.
sswt вне форума Ответить с цитированием
Старый 22.09.2015, 18:38   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Где я налажала?
Много где...

Цитата:
int* outStr = (int*)malloc(sizeof(int));
Это же возвращаемая строка. Почему инт? Почему размер 4 байта? У вас строка не длиннее будет?

Цитата:
if (*inStr == *sDistionary)
Строки так не сравнивают. Даже если б сравнивали, то что этим сравнением вы добились бы?

Цитата:
++outStr;
Куда вы его двигаете? У вас память выделена только на 1 элемент.
p51x на форуме Ответить с цитированием
Старый 22.09.2015, 18:43   #3
sswt
Пользователь
 
Регистрация: 02.09.2015
Сообщений: 14
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Много где...


Это же возвращаемая строка. Почему инт? Почему размер 4 байта? У вас строка не длиннее будет?


Строки так не сравнивают. Даже если б сравнивали, то что этим сравнением вы добились бы?


Куда вы его двигаете? У вас память выделена только на 1 элемент.
Можете навести пример ка надо правильно, я не прошу сделать, а просто другой пример взять какойто , что бы я увидела как нужно, а то я уже запуталась(
sswt вне форума Ответить с цитированием
Старый 22.09.2015, 18:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Код:
char* StrCopy( const char* inStr)
{
    char * sDistionary = "eyuioa;";
    int len=0,i,j=0;
    for(i=0;inStr[i];i++) len+=(strchr(sDistionary,inStr[i]))?1:0;
    char* outStr = (char*)malloc(len)+1;
    for(i=0;inStr[i];i++) if(strchr(sDistionary,inStr[i])) outStr[j++]=inStr[i];
    outStr[j]=0;
    return outStr;
 
}
Годится?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.09.2015, 18:50   #5
sswt
Пользователь
 
Регистрация: 02.09.2015
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
char* StrCopy( const char* inStr)
{
    char * sDistionary = "eyuioa;";
    int len=0,i,j=0;
    for(i=0;inStr[i];i++) len+=(strchr(sDistionary,inStr[i]))?1:0;
    char* outStr = (char*)malloc(len)+1;
    for(i=0;inStr[i];i++) if(strchr(sDistionary,inStr[i])) outStr[j++]=inStr[i];
    outStr[j]=0;
    return outStr;
 
}
Годится?
нет) а без встроеной функции strchr можно?
и мне нужно динамично память выдилять на Си
sswt вне форума Ответить с цитированием
Старый 22.09.2015, 19:03   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
а без встроеной функции strchr можно?
Ну напиши
Код:
(inStr[i]=='e' || inStr[i]=='i' || и так далее)?...
Цитата:
мне нужно динамично память выдилять на Си
А я что написал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.09.2015, 19:06   #7
sswt
Пользователь
 
Регистрация: 02.09.2015
Сообщений: 14
По умолчанию

Цитата:
А я что написал?
я извиняюсь не увидела)
Как то так?:
Код:
unsigned StrCopy( const char* inStr)
{
	char * sDistionary = "eyuioa;";
	int len = 0;
	int j = 0;

	for (int index = 0; *inStr; ++index)
	{
		len += (*inStr == 'a' || *inStr == 'e' || *inStr == 'y' || *inStr == 'u' || *inStr == '0' || *inStr == ';');
			
	}
	char* outStr = (char*)malloc(len) + 1;


	for (int index = 0; *inStr; index++)
	{
		if ((inStr[index] == 'a' || inStr[index] == 'e' || inStr[index] == 'y' || inStr[index] == 'u' || inStr[index]== '0' || inStr[index] == ';'))
		{
			outStr[j++] = inStr[index];
			outStr[j] = 0;
		}
	}
	return *outStr;

}

Последний раз редактировалось sswt; 22.09.2015 в 21:15.
sswt вне форума Ответить с цитированием
Старый 22.09.2015, 21:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
for (int index = 0; *inStr; index++)
Пиши:
Код:
for (int index = 0; inStr[index]; index++)
И вообще должно быть тогда уж так:
Код:

char* StrCopy( const char* inStr)
{
    char * sDistionary = "eyuioa;";
    int len=0,i,j=0,k,ok;

    for(i=0;inStr[i];i++) {
      ok=0; for(k=0;sDistionary[k] && !ok;k++) ok=sDistionary[k]==inStr[i];
      len+=(ok)?1:0;
    }

    char* outStr = (char*)malloc(len)+1;
    for(i=0;inStr[i];i++) {
      ok=0; for(k=0;sDistionary[k] && !ok;k++) ok=sDistionary[k]==inStr[i];
      if(ok) outStr[j++]=inStr[i];
    }
    outStr[j]=0;
    return outStr;
 
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2015, 18:36   #9
sswt
Пользователь
 
Регистрация: 02.09.2015
Сообщений: 14
По умолчанию

и так я переделала еще раз и решила сделать следущее, но не знаю как((
написать указатель функции, принимает на вход строку и возвращает на выходе его копию так, чтобы в ней не было громких английских букв и точки с запятой. У меня есть функция которая ищет и выводит на екран строку без гластных и крапки с комой. Но я хочу так как там 2 if однаковых заменит их на указател на еще одну функию в котрой я все это и буду проверять
Код:
char* StrCopyDistionary( const char* inStr)
{
    int len = 0;
    int out = 0;
 
    for (int index = 0; inStr[index] !='\0'; ++index)
    {
        if (!(inStr[index] == 'a' ||
            inStr[index] == 'e' || 
            inStr[index] == 'i' || 
            inStr[index] == 'y' || 
            inStr[index] == 'u' || 
            inStr[index] == 'o' || 
            inStr[index] == ';'))
            ++len;
    }
 
    char* outStr = (char*)malloc((len + 1) * sizeof(char));
    for (int index = 0; inStr[index] != '\0'; ++index)
    {
        if (!(inStr[index] == 'a' ||
            inStr[index] == 'e' || 
            inStr[index] == 'i' ||
            inStr[index] == 'y' || 
            inStr[index] == 'u' || 
            inStr[index] == 'o' || 
            inStr[index] == ';'))
            outStr[out++] = inStr[index];
    }
    outStr[out] = '\0';
    
    return outStr;
}
 
const char* str4 = "1a2buycigfd3744bhqwdc";
    char* strCopyDistionary = StrCopyDistionary(str4);
    printf("strCopyDistionary:%s\n", strCopyDistionary);
    free(strCopyDistionary);
Посмотрела по примеру в книге. Я правильно сделала?
Код:
int strDistionary(const char* inStr, int index)
{
	if (!(inStr[index] == 'a' ||
		inStr[index] == 'e' ||
		inStr[index] == 'i' ||
		inStr[index] == 'y' ||
		inStr[index] == 'u' ||
		inStr[index] == 'o' ||
		inStr[index] == ';'));
	return !inStr[index];
}
char* StrCopyDistionary( const char* inStr)
{
	int len = 0;
	int out = 0;

	for (int index = 0; inStr[index] !='\0'; ++index)
	{
			int(*pStr)(const char*, int) = strDistionary;
			++len;
	}

	char* outStr = (char*)malloc((len + 1) * sizeof(char));
	for (int index = 0; inStr[index] != '\0'; ++index)
	{
		int(*pStr)(const char*, int) = strDistionary;
		outStr[out++] = inStr[index];
	}
	outStr[out] = '\0';
	
	return outStr;
}

Последний раз редактировалось Stilet; 23.09.2015 в 19:10.
sswt вне форума Ответить с цитированием
Старый 23.09.2015, 19:12   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
int(*pStr)(const char*, int) = strDistionary;
Чито это? Что за книгу ты читаешь?
Код:
	for (int index = 0; inStr[index] !='\0'; ++index)
	{
			if(strDistionary(inStr,index)) ++len;
	}
Вот так вот я еще понимаю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функцию, которая принимает в качестве параметра строку и символ и вычисляет количество таких символов в строке (Delphi) Loqwer78rus Помощь студентам 10 06.05.2014 10:52
функция возвращает максимальное из 2 целых чисел, полученных в качестве аргумента C++ визуальный режим (есть код) carrie bradshaw Помощь студентам 3 30.01.2014 21:23
Функция, которая на вход получает 2 строки, новую строку отправляет обратно Оксана5 Общие вопросы C/C++ 1 19.10.2013 14:09
Delphi функция которая возвращает 2 значения gufon Общие вопросы Delphi 10 24.02.2012 08:03
функция получае на вход строку чисел, выводит строку символов DellOleg Microsoft Office Access 2 18.02.2012 11:17