Почему эта выходная строка в число? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть вопрос о функции strcmp в c.В качестве домашней работы мы проводим некоторые сравнения строк.Но одно не ясно, мы должны сравнить числа с этой функцией.Я знаю, что есть другие методы сравнения для сравнения чисел, но наш проф использует это следующим образом.

Когда я использовал такую ​​функцию:

char string1[] = "1";
char string2[] = "2"

printf("Compare between str1 and str2: %d, %d", strcmp(string1, string2));

-> Вывод:

Compare between str1 and str2: 1

Что означало бы, что строка 1. больше.

Затем у меня есть printf только с переменными:

printf("string1 %d", string1);  //output: 6356750
printf("string2 %d", string2);  //output: 6356748

Почему существуют такие числа?И что означают эти числа?

Я думал, что числа в массиве строк представляют код ASCII, но я думаю, что я неправ.

Ответы [ 3 ]

5 голосов
/ 15 мая 2019

Пожалуйста, составьте полное предупреждение! Всегда внимательно читайте эти предупреждения!

Компилятор должен был сказать вам, что ваша строка формата неверна.

Аргументы% в printf описывают тип переменной, которую вы предоставляете. Они не предоставляют никакого «свободного» преобразования типов, только форматирование, поэтому, поскольку у вас есть строки, вам нужно использовать %s

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

4 голосов
/ 15 мая 2019

Даже если строки содержат числа, они по-прежнему строки , и вам необходимо распечатать их в формате "%s":

printf("Compare between str1 and str2: %s, %s", string1, string2);
//                                     ^^  ^^
// Note the format specifier being different

Что касается напечатанных "чисел", помните, что массивы распадаются на указатели на их первый элемент. Это десятичное значение тех указателей, которые вы печатаете.

Следует отметить, что использование несоответствующего спецификатора формата и аргумента (например, использование "%d" для печати строки) приводит к неопределенному поведению .


Если вы хотите использовать фактические числа и сравнить их, например, с. < или >, вместо этого вы должны иметь числовой тип, как в

int number1 = 1;
int number2 = 2;

Затем вы можете распечатать их с помощью спецификатора формата "%d", так как он ожидает аргумент типа int:

printf("Compare between number1 and number2: %d, %d", number1, number2);
0 голосов
/ 15 мая 2019
printf("Compare between str1 and str2: %d, %d", string1, string2);

Таким образом вы печатаете адрес в памяти строки1 и строки2, в стеке, потому что это массив фиксированного размера

Для печати строки используйте %s:

printf("Compare between str1 and str2: %s, %s", string1, string2);

Но эта строка ДОЛЖНА завершаться нулем ('\ 0'), иначе функция будет считывать в памяти, пока не будет найдена ячейка со значением 0.

Чтобы найти ASCII-код CHAR (не всю строку), используйте это:

printf("first char of str1: %c = %d", string1[0], (int)string1[0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...