почему printf не показывает строку при удалении & и не показывает адрес в C? - PullRequest
0 голосов
/ 06 ноября 2018
#include<stdio.h>

void main(){

char *r;
printf("Enter the string : ");
scanf("%s",&r); 
printf("\nThe string is : %s",&r);

}

Я использую DEV C ++ (64-разрядная версия tdm-gcc 4.9.2) в печати и удалении приведет к печати строки, но это не показывает вывод, который меня смущает много и я прочитал, что мы можем также использовать сканирование без & в случае строки, но это также не работает в C

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Существует большая разница между char buf [64] и char * buf. * ​​1001 *

Я предлагаю вам узнать разницу, напечатав размер этих двух объявлений.

EX:

    char *r;
    char buf[64];

printf(" Size of array :%d pointer :%d\n", sizeof(buf), sizeof(r));

char * r; является чистой декларацией указателя, который содержит адрес переменной типа char. char * r - это указатель на символ, и сейчас он указывает на ненужное значение. char buf [64], это буфер символов длиной 64 байта, и buf указывает на первый символ.

char * r указывает неизвестное / нежелательное значение. Перед использованием такого подхода вы должны выделить память.

char *r = (char *) malloc(32);
or
char buf[64];
char *r;

r = buf;  

---> Теперь 'r' указывает на buf, у которого уже есть выделенная память.

Теперь вы можете понять разницу.

0 голосов
/ 06 ноября 2018

Спецификатор формата %s для scanf ожидает указатель на первый элемент массива char. Другими словами, char *. Вы вместо этого передаете char **. Использование неправильного спецификатора формата вызывает неопределенное поведение .

Определить r как массив:

char r[100];

Затем вы можете передать r в scanf, который превращается в указатель на первый элемент:

scanf("%99s", r);

Обратите внимание, что здесь мы указываем максимальную длину, чтобы не было риска записи за конец массива, если введено слишком много символов.

Аналогично printf, вам нужно вызвать его следующим образом:

printf("\nThe string is : %s",r);
...