Почему вывод этой программы всегда:

example 

example

Если я заменю первую строку на вторую в цикле for, то вывод будет выглядеть так:

EXAMPLE

EXAMPLE

Что я делаю не так?

string key = "EXAmple";
string ukey = key; 
string lkey = key;

for (int i = 0; i < strlen(key); i++)
{
  ukey[i] = toupper(key[i]); 
  lkey[i] = tolower(key[i]);
}       

printf("%s\n", ukey);
printf("%s\n", lkey);
c
1
susi33 11 Дек 2014 в 22:51
Насколько я знаю, string не является определенным термином в C. Таким образом, ответ будет зависеть от того, как он был определен.
 – 
Scott Hunter
11 Дек 2014 в 22:55
Опубликуйте определение string. Это char *?
 – 
chux - Reinstate Monica
11 Дек 2014 в 23:00
1
Где-нибудь есть typedef char* string;? Или еще хуже, #define string char*? Это может быть файл заголовка, который вы #include.
 – 
Fred Larson
11 Дек 2014 в 23:01
У меня есть #include <string.h> в заголовке. Я нуб-программист и не знаю, как ответить на ваши вопросы.
 – 
susi33
11 Дек 2014 в 23:13

2 ответа

Определение string, скорее всего, будет char*. Следовательно, key, ukey и lkey на самом деле являются указателями, указывающими на одну и ту же память; они просто псевдонимы для одного и того же.

5
Codor 11 Дек 2014 в 22:53
1
Разве запись в строковый литерал не является неопределенным поведением?
 – 
Scott Hunter
11 Дек 2014 в 22:55
Возможно; Я не знаю.
 – 
Codor
11 Дек 2014 в 22:57
1
@ScottHunter: Да, но это не мешает ему работать нормально.
 – 
Fred Larson
11 Дек 2014 в 22:58
Этот ответ, указанный ниже, хорош: он может работать, но вызывает неопределенное поведение, особенно если другая строка имеет тот же литерал. stackoverflow.com/questions/2245664/string-literals-in-c
 – 
Weather Vane
11 Дек 2014 в 22:59
Ответ кажется сложным; обсуждение здесь связано с stackoverflow.com/questions/8718740/…
 – 
Codor
11 Дек 2014 в 23:01

Здесь ukey и lkey, скорее всего, являются указателями на один и тот же массив в памяти. В C ссылка на массив — это просто указатель на первый элемент в массиве, а использование оператора [] просто возвращает значения в каждой позиции массива (разыменованные).

Итак, ukey и lkey относятся к одним и тем же символам.

Похоже, вы хотите использовать strcpy() вместо обычного присваивания или эквивалент для вашего пользовательского типа string.

Или используйте C++ и его строковый тип.

2
Patrick Szalapski 11 Дек 2014 в 23:23
Это будет зависеть от определения string, нет?
 – 
Scott Hunter
11 Дек 2014 в 22:54
Истинный. Я делаю предположение об этом, я полагаю. Фиксированный.
 – 
Patrick Szalapski
11 Дек 2014 в 22:55