Как использовать toupper() для указателя на строку?

Я пробовал следующее: *string = toupper(*string);

Это только сделал первый символ строкового указателя на верхний регистр указателя. Я хочу, чтобы все символы, на которые указывает указатель *, были в верхнем регистре. В любом случае, я могу это сделать?

2 ответа

Вы можете сделать это, как показано ниже

char s[] = "hello world";

for ( char *p = s; *p; ++p ) *p = toupper( ( unsigned char )*p );

Учтите, что вы не можете изменять строковые литералы. Строковые литералы неизменны. Если вы напишите, например, в приведенном выше коде

char *s = "hello world";

вместо

char s[] = "hello world";

тогда поведение программы будет неопределенным.

Вам нужно перебирать каждый символ, как это

for (size_t i = 0 ; string[i] != '\0' ; ++i)
    string[i] = toupper((unsigned char) string[i]);

Поведение, которое вы наблюдаете, потому что * разыменовывает указатель, и поскольку вы разыменовываете указатель, не увеличивая его, вы просто устанавливаете первый элемент последовательности символов.

* Оператор работает с указателем следующим образом: *(pointer + offset) эквивалентно pointer[offset], Так *string = toupper(*string) эквивалентно

string[0] = toupper(string[0]);
Другие вопросы по тегам