Почему я получаю местоположение элемента массива вместо его значения?С - PullRequest
0 голосов
/ 06 июня 2018
#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h = c[4];
    printf("%s",h);

} Почему h приводит к положению элемента, а не к значению? Ошибка: warning: format '% s' ожидает аргумент типа 'char *', но аргумент 2 имеет тип 'int'[-Wformat =]

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы не получаете местоположение, вы получаете случайное число, полученное из вашей памяти.

char h - это один символ.

char[] или char* - это символадрес (ячейка памяти) начала последовательности символов, один за другим.

%s ожидает, что вы дадите ему char*.

Вы даете ему h, один char.

Итак, что делает компьютер (по историческим причинам), так это то, что он позволяет вам избежать неприятностей, даже если он ошибочен (это предупреждение действительно должно быть ошибкой).Отказ от этого означает, что он принимает значение ASCII символа, хранящегося в h (и в зависимости от того, находитесь ли вы в 32-разрядной или 64-разрядной системе, несколько случайных байтов, следующих за этим символом в памяти), поэтому случайное число,и интерпретирует его как адрес памяти диапазона символов (a char*), и пытается напечатать это.

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

То, что вы должны сделать, выглядит примерно так:

#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h = c[4];
    printf("%c",h); // Change %s to %c, which is for char, not char*
}

или поочередно:

#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h[2] = { 0, 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
    h[0] = c[4];
    printf("%s",h);
}

Если ваш компилятор достаточно новый, вы могли бы даже написать:

#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h[2] = { c[4], 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
    printf("%s",h);
}

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

0 голосов
/ 06 июня 2018

Оператор

printf("%s",h);

вызывает предупреждение, как вы упомянули

предупреждение: формат '% s' ожидает аргумент типа 'char *',но аргумент 2 имеет тип 'int' [-Wformat =]

, поскольку h объявлен как тип char и для печати спецификатор формата символьной переменной равен %c.Поэтому используйте %c вместо %s, поскольку %s ожидает аргумент типа char*, а не типа char.

Почему h приводит к положению элемента, а не к значению? Нет, если вы печатаете как printf("%c\n",h);, то печатается значение, которое содержит c[4].

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