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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2008, 23:30   #1
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию Ошибки в программе(visual c+++)

Написал прогу, которая проверяет, каким регистром пользователь ввел слово (Верхним / нижним или и тем и тем) .Выдает вот такие ошибки:
c:\projects\upper register\u.cpp(14) : error C2664: 'strlwr' : cannot convert parameter 1 from 'char' to 'char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
c:\projects\upper register\u.cpp(15) : error C2664: 'strupr' : cannot convert parameter 1 from 'char' to 'char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

Upper register.exe - 2 error(s), 0 warning(s)

Помогите пожалуйста разобраться. cannot convert parameter 1 from 'char' to 'char *' может я с указателями чего-то не понял.
Код:

Код:
#include <iostream.h>
#include <string.h>
void show_upper_lower(char *ptr,char slovo_zelikom[])
{
	//функция будет сканировать строку с помощью указателя.
	//если upr_total равен длине слова целиком то слово 
          полностью верхнего регистра 
	int upr_total;
	int lwr_total;
	int bukva_upr=0;
	int bukva_lwr=0;
	char registr_1,registr_2;
	registr_1=strlwr(*ptr);
	registr_2=strupr(*ptr);
	for (*ptr=0;*ptr!=NULL;*ptr++)
	{
	   if (registr_1)//если указатель указывает на букву не нижнего регистра
	   {
           upr_total=bukva_upr++;
	   }
	   else if (registr_2)//если указатель указывает на букву не верхнего регистра
	   {  
		   lwr_total=bukva_lwr++;
	   }
	}   
	cout<<"Upper total" <<upr_total<<endl;
	cout<<"Lower total" <<lwr_total<<endl;
	int dlina;
	dlina=strlen(slovo_zelikom);
    if (dlina==upr_total)
		cout<<"Slovo polnostyu verhnego registra"<<endl;
	else if (dlina==lwr_total)
		cout<<"Slovo polnostyu nijnego registra"<<endl;
	else 
	cout<<"Slovo s bukvami i verhnego registra i nijnego"<<endl;
}
void main()
{
	char slovo[64];
	cout<<"Vvedite slovo: ";
	cin>>slovo;
	show_upper_lower(slovo,slovo);
}
JOFRIF вне форума Ответить с цитированием
Старый 23.08.2008, 00:33   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну так вам же сказал компилятор, что вы передаёте символ, а нужно передавать строку. Функция strlwr - переводит строку в нижний регистр и возвращает указатель на эту строку
pu4koff вне форума Ответить с цитированием
Старый 23.08.2008, 00:44   #3
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Ну так вам же сказал компилятор, что вы передаёте символ, а нужно передавать строку. Функция strlwr - переводит строку в нижний регистр и возвращает указатель на эту строку
Объясните пожалуйста , я не совсем понял(Лучше с кодом). какую строку нужно передавать и куда функция strlwr возвращает указатель.
JOFRIF вне форума Ответить с цитированием
Старый 23.08.2008, 01:14   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Вот примерно решение "в лоб"
Код:
char str[]="My StRiNg"; // Исходная строка
	char *lo_str = _strdup(str); // Копируем исходную строку для хранения в нижнем регистре
	char *hi_str = _strdup(str); // и в верхнем
	_strlwr(lo_str); // переводим в нижний регистр
	_strupr(hi_str); // и в верхний
	printf("%s\n%s\n%s\n",str,lo_str,hi_str);

	if (!strcmp(str,lo_str)) // Исходная строка равна строке в нижнем регистре
		printf("String is lowercase\n");
	else if (!strcmp(str,hi_str)) // в верхнем
		printf("String is uppercase\n");
	else // В строке использованы оба регистра
		printf("String is mixed\n");
ЗЫ. совсем забыл. функции _strlwr и _strupr возвращают указатель на строку в верхнем и нижнем регистрах соответственно. Если в процесе преобразования произошла ошибка, то они вернут NULL, Если же нет, то результат будет равен переданному параметру)
т.е.
после b = _strlwr(a);
b и а будут указывать на одну и ту же строку или b будет равен NULL, если произойдет сбой

Последний раз редактировалось pu4koff; 23.08.2008 в 01:18.
pu4koff вне форума Ответить с цитированием
Старый 23.08.2008, 01:38   #5
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Да про string compare я и не подумал, спасибо.
А в моём примере что нужно изменить чтобы она заработала с моим текстом(просто не хочу переписывать со strcmp'ром)?
Еще два вопроса:1)Указатель в вашем случае служит временным файлом?
2)Где можно посмотреть как работает функция strdup и всю прочею инфу про нее?

ЗЫ.могу поделится таким сайтом но правда там нет функции strdup
http://www.cplusplus.com/reference/clibrary/

Последний раз редактировалось JOFRIF; 23.08.2008 в 01:53.
JOFRIF вне форума Ответить с цитированием
Старый 23.08.2008, 14:17   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от JOFRIF Посмотреть сообщение
А в моём примере что нужно изменить чтобы она заработала с моим текстом(просто не хочу переписывать со strcmp'ром)?
На первый взгляд нужно менять тип registr_1 и registr_2 на char*, менять цикл и условия в нем.
Только вот зачем у Вас два совершенно идентичных параметра у функции?
Логичнее было бы передавать только указатель на начало строки, с учетом что она заканчивается нулём или ещё передавать длину проверяемой строки, в таком случае можно будет проверять не всю строку, а отдельные её слова.
Цитата:
Сообщение от JOFRIF Посмотреть сообщение
Еще два вопроса:1)Указатель в вашем случае служит временным файлом?
Каким еще файлом? lo_str и hi_str используются для хранения указателей на две вспомогательные временные строки
Цитата:
Сообщение от JOFRIF Посмотреть сообщение
2)Где можно посмотреть как работает функция strdup и всю прочею инфу про нее?
MSDN или в яндексе просто ищете по strdup и читаете. Главное не забывать после её использования очищать память посредством вызова free(х), как это сделал я в приведенном примере
pu4koff вне форума Ответить с цитированием
Старый 23.08.2008, 16:20   #7
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
На первый взгляд нужно менять тип registr_1 и registr_2 на char*, менять цикл и условия в нем.
Только вот зачем у Вас два совершенно идентичных параметра у функции?
Почему идентичных? Первый параметр *ptr для сканирования строки ,
и для подсчета букв, чтобы потом сравнить длину насчитаных букв, со вторым параметром slovo_zelikom[], который ожидает слово целиком.

Цитата:
MSDN или в яндексе просто ищете по strdup и читаете. Главное не забывать после её использования очищать память посредством вызова free(х), как это сделал я в приведенном примере
Спасибо я нашел инфу про strdup, и вообще вы мне очень помогли.
JOFRIF вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите исправить ошибки в программе... VDK23 Помощь студентам 1 17.04.2008 13:05
Помогите исправить ошибки в программе Gambit90 Помощь студентам 1 20.12.2007 16:24
Visual c++ 2005 и Visual c++ 6 это разные версии или нет? Руслантус Свободное общение 3 30.11.2007 19:42
Visual J# from Microsoft Visual Studio .NET Flash_ Общие вопросы по Java, Java SE, Kotlin 2 28.12.2006 10:16