Преобразование Char * в верхний регистр в C

Я пытаюсь преобразовать char * в верхний регистр в c, но функция toupper() здесь не работает.

Я пытаюсь получить имя значения temp, имя может быть любым перед двоеточием, в данном случае это «Тест», а затем я хочу полностью использовать имя с большой буквы.

void func(char * temp) {
 // where temp is a char * containing the string "Test:Case1"
 char * name;

 name = strtok(temp,":");

 //convert it to uppercase

 name = toupper(name); //error here

}

Я получаю сообщение об ошибке, что функция toupper ожидает int, но получает char *. Дело в том, что я должен использовать char *, так как это то, что принимает функция (здесь я не могу использовать массивы char, не так ли?).

Любая помощь будет принята с благодарностью.


person EDEDE    schedule 03.02.2016    source источник


Ответы (5)


toupper() преобразует один char.

Просто используйте цикл:

void func(char * temp) {
  char * name;
  name = strtok(temp,":");

  // Convert to upper case
  char *s = name;
  while (*s) {
    *s = toupper((unsigned char) *s);
    s++;
  }

}

Деталь: Стандартная библиотечная функция toupper(int) определена для всех unsigned char и EOF. Поскольку char может быть подписанным, преобразуйте его в unsigned char.

Некоторые ОС поддерживают вызов функции, которая делает это: upstr() и strupr()

person chux - Reinstate Monica    schedule 03.02.2016
comment
Какие системы обычно поддерживают upstr? В справочной странице Debian для upstr указано, что это от Альянса CAD-система. - person fakedad; 22.09.2019

toupper() работает только с одним персонажем. Но есть strupr(), который вам нужен для указателя на строку.

person wallyk    schedule 03.02.2016
comment
strupr не является стандартным. Насколько я знаю, он поддерживается только библиотекой Microsoft. - person interjay; 03.02.2016
comment
@interjay: его также поддерживают Greenhills и Borland. Но вы правы, его нет в glibc. - person wallyk; 03.02.2016

Для тех из вас, кто хочет перевести строку в верхний регистр и сохранить ее в переменной (это то, что я искал, когда читал эти ответы).

#include <stdio.h>  //<-- You need this to use printf.
#include <string.h>  //<-- You need this to use string and strlen() function.
#include <ctype.h>  //<-- You need this to use toupper() function.

int main(void)
{
    string s = "I want to cast this";  //<-- Or you can ask to the user for a string.

    unsigned long int s_len = strlen(s); //<-- getting the length of 's'.  

    //Defining an array of the same length as 's' to, temporarily, store the case change.
    char s_up[s_len]; 

    // Iterate over the source string (i.e. s) and cast the case changing.
    for (int a = 0; a < s_len; a++)
    {
        // Storing the change: Use the temp array while casting to uppercase.  
        s_up[a] = toupper(s[a]); 
    }

    // Assign the new array to your first variable name if you want to use the same as at the beginning
    s = s_up;

    printf("%s \n", s_up);  //<-- If you want to see the change made.
}

Примечание. Если вы хотите перевести строку в нижний регистр, измените toupper(s[a]) на tolower(s[a]).

person Mike    schedule 01.03.2019
comment
Любопытно, а зачем использовать тип unsigned long int s_len вместо unsigned s_len или даже лучше size_t s_len? Кажется странным использовать unsigned long s_len и int a в a < s_len. Я ожидаю, что переменные будут одного типа. - person chux - Reinstate Monica; 04.06.2019
comment
Честно говоря, я новичок в C и программировании в целом, поэтому вполне вероятно, что типы переменных не самые лучшие. - person Mike; 11.06.2019

Как насчет этой маленькой функции? Он предполагает, что символы представлены в ASCII, и изменяет строку на месте.

void to_upper(char* string)
{
    const char OFFSET = 'a' - 'A';
    while (*string)
    {
        *string = (*string >= 'a' && *string <= 'z') ? *string -= OFFSET : *string;
        string++;
    }
}
person João Pedro Nascimento    schedule 07.08.2020

toupper() работает с одним элементом (аргумент int, диапазон значений такой же, как у unsigned char или EOF) вовремя.

Опытный образец:

int toupper(int c);

Вам нужно использовать цикл для предоставления одного элемента за раз из вашей строки.

person Sourav Ghosh    schedule 03.02.2016
comment
Возможно, я удалю этот ответ, так как он не добавляет ценности, но в чем причина DV? - person Sourav Ghosh; 04.02.2016