2013-06-03 6 views
2

Я сделал реализацию toUpper(). Он не работает на 100%.Реализация C++ toUpper

Код:

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; 

я ожидал программу для вывода , но вместо этого я получил «ЧТО». Что я сделал не так?

+0

Вы делаете это в образовательных целях? –

+1

Цикл 'while' выключен одним символом (тот, который вы тестируете в предикате, не тот, который вы тестируете/изменяете в теле). Вы должны изменить его на соответствующий цикл 'for' или, по крайней мере, перенести инкремент указателя в конец тела цикла. – syam

+0

@JohnDibling Да, почему? – Davlog

ответ

6
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); 
+6

Точно. Пространство ('' '') является ASCII 32, поэтому вычитание 32 дает NUL, заставляя 'cout' останавливаться на этом. –

+0

Opps ... thanks xD – Davlog

+0

Символ пробела - десятичный 32, поэтому исходный код терпит неудачу, потому что оператор if равен true, вы вычитаете 32, и поэтому следующая проверка цикла while возвращает false. – Jerr

2

Having ++ в то время заставляет вас пропустить важные дела. В int() нет ненужного шума. Вам нужно & & в состоянии проверки. Действие можно записать с помощью = =.

+0

Почему у меня ++ в моем случае заставляют меня пропустить важные случаи? – Davlog

+0

@Davlog Это означает, что вы увеличиваете 'sv' до первой проверки для строчного символа. Поэтому '' hello'' будет преобразован в '' hELLO'' – simonc

+0

Хм .. вы правы! Первое письмо было уже верхней буквой, поэтому я не заметил: P Спасибо! – Davlog

1

Вот переписан, который использует цикл и фиксирует ваш условный, а также вне по-один шаг:

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; 
} 
+1

Где sv объявлено и определено? – Davlog

+1

Хороший улов: 'sv' по-прежнему от вашей реализации – smocking

0

Re: «Я ожидал, что программа для вывода„WHATS UP“, но вместо этого я? получил «ЧТО». Что я сделал не так? » Вы не указали код, который неисправен. Если бы я должен был догадаться, в основном вы вызываете argv [1], но я только предполагаю, что ваш основной не включен.