Я сделал реализацию toUpper (). Это не работает на 100%.
Код:
char* toUpper(char* string)
{
char* sv = string;
while(*sv++ != '\0')
{
if( int(*sv) >= 97 || int(*sv) <= 122) //Only if it's a lower letter
*sv = char( *sv - 32);
}
return string;
}
Я знаю, что строчные буквы имеют цифры от 97 до 122 (в ASCII), а верхние буквы — от 65 до 90. Между строчными и строчными буквами ровно 32 цифры. Поэтому я просто вычел 32 из нижнего знака.
Код, где я вызываю эту функцию:
char h[] = "Whats up?";
cout << toUpper(h) << endl;
Я ожидал, что программа выведет «ЧТО ПРОИСХОДИТ?» но вместо этого я получил «WHATS». Что я сделал не так?
if( int(*sv) >= 97 || int(*sv) <= 122)
должно быть
if( int(*sv) >= 97 && int(*sv) <= 122)
или предпочтительно
if( *sv >= 'a' && *sv <= 'z')
*sv = *sv - ('a' - 'A');
Вам также нужно переместить точку, в которой вы увеличиваете sv
, Текущий код пропускает проверку первого символа в string
while(*sv != '\0')
{
if( *sv >= 'a' && *sv <= 'z')
*sv = *sv - ('a' - 'A');
sv++;
}
Наконец, я уверен, что вы знаете об этом, но на всякий случай … если это не домашнее задание или другое учебное упражнение, стандарт C ToUpper функция сделает для вас точно такую же работу
*sv = (char)toupper(*sv);
Наличие ++ в то же время заставляет вас упускать важные дела. В int () все лишнее. Тебе нужно && в состоянии проверки. Действие может быть записано с — =.
Вот переписывание, которое использует цикл for и исправляет как условное, так и пошаговое приращение:
char* toUpper(char* string)
{
for(char* p=string; *p != '\0'; p++)
{
if(*p >= 'a' && *p <= 'z') //Only if it's a lower letter
*p -= 32;
}
return string;
}
re: «Я ожидал, что программа выдаст« ЧТО ТАКОЕ? », но вместо этого я получил« ЧТО ». Что я сделал не так?» Вы не предоставили код, который является дефектным. Если бы мне пришлось угадывать, в основном вы звоните argv [1], но я только догадываюсь, что ваш main не включен.