Почему значение x равно 28 в данном фрагменте кода C? - PullRequest
0 голосов
/ 06 мая 2019
char str1[] = "dills";
char str2[20] ="Hello";
char str3[] = "daffo";
int x;
x = strcmp("daffodills",strcat(str3, strcpy(str1, str2)));

Я думаю - strcpy (str1, str2)) делает str1 = «Hello».Следовательно, strcat (str3, strcpy (str1, str2)) = strcat (str3, «Hello») = daffoHello.Наконец, strcmp («daffodills», «daffoHello») = 1, поскольку значение ASCII первого несопоставленного символа (d) больше, чем второй (H).

Но значение x для компилятора равно 28 в выходных данных.

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Это неопределенное поведение. char str3[] = "daffo"; делает массив достаточно большим, чтобы содержать "dills" и следующий нулевой терминатор. Затем вы делаете это:

strcat(str3, strcpy(str1, str2)));

, который добавляет к этой строке еще одну строку и вызывает ее переполнение. Мы могли бы предположить, почему x является 28, но нет никакого смысла, поскольку нет никаких гарантий относительно его стоимости. Это может быть что-то еще, или программа может аварийно завершить работу, прежде чем она выдаст результат (для меня это повреждение стека, аварийное завершение программы. Это означает, что место в памяти, которое важно для работы потока управления программы, например, стек) указатель, искаженный неопределенным поведением, которое вызывает strcat).


Кроме того, strcmp дает возвращаемые значения, определенные как 0, что-то положительное или что-то отрицательное. Это единственная гарантия, я видел реализации, где он может возвращать что-то вроде 28, и реализации, где он всегда будет возвращать 0, 1 или -1. Поэтому, даже если программа четко определена, на вопрос «почему она возвращает 28» нельзя ответить без дополнительной информации об используемой реализации strcmp.

0 голосов
/ 06 мая 2019

Это происходит потому, что значения ASCII различны для прописных и строчных букв.
Значение ASCII в верхнем регистре H равно 72, а в нижнем регистре d - 100 100-72 = 28 Ваш компилятор возвращает разницу значений ASCII.Если вы хотите игнорировать дела, используйте stricmp().Если вы используете это, вы получите 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...