Как использовать 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]);