Может ли указатель на строку использоваться в printf?
Я думаю о чем-то вроде:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(void) {
//test pointer to string
char s[50];
char *ptr=s;
printf("\nEnter string (s): ");
fgets(s, 50, stdin);
printf("S: %s\nPTR: %s\n", s, *ptr);
system("PAUSE");
return 0;
}
Или я должен использовать цикл for с * (s + i) и спецификатором формата% c?
Это единственный возможный способ печати строки через указатель и простой printf?
Обновление: printf работает с адресом первого элемента массива, поэтому, когда я использую * ptr, я фактически работаю с первым элементом, а не с адресом. Спасибо.
Ответы
Ответ 1
Спецификатор формата "%s"
для printf
всегда ожидает аргумент char*
.
Дано:
char s[] = "hello";
char *p = "world";
printf("%s, %s\n", s, p);
похоже, что вы передаете массив для первого %s
и указателя для второго, но на самом деле вы (правильно) передаете указатели для обоих.
В C любое выражение типа массива неявно преобразуется в указатель на первый элемент массива, если только в одном из следующих трех контекстов:
- Это аргумент унарному "&" (адрес) оператора
- Это аргумент для унарного оператора "sizeof"
- Это строковый литерал в инициализаторе, используемом для инициализации объекта массива.
(Я думаю, что С++ имеет одно или два других исключения.)
Реализация printf()
видит "%s"
, предполагает, что соответствующий аргумент является указателем на char, и использует этот указатель для перемещения строки и печати.
Раздел 6 comp.lang.c FAQ имеет прекрасное обсуждение этого вопроса.
Ответ 2
printf("%s\n", ptr);
Это то, что вы хотите?
Кстати, из printf(3)
здесь представлена документация для спецификатора преобразования s
(т.е. %s
):
Если нет модификатора l: ожидается, что аргумент const char *быть указателем на массив типа символа (указатель на строку). Символы из массива записываются (но не включая) завершение нулевого байта ('\ 0'); если задана точность, не более чем указано указанное число. Если дана точность, нет нулевой байт должен присутствовать; если точность не указана или больше, чем размер массива, массив должен содержать завершение нулевого байта.
Ответ 3
вы должны сделать "printf (" S:% s\nPTR:% s\n ", s, ptr);" вместо printf ( "S:% s\nPTR:% s\n", s, * ptr);
разница между ptr и * ptr: ptr дает вам адрес в памяти переменной, на которую вы указываете, и * ptr дает скорее значение variable В этом случае это * ptr = ptr [0]
этот код покажет, что я имею в виду:
printf("\tS: %s\n\tPTR: %s\n\tAddress of the pointed Value: %x\n\tValue of the whole String: %s\n\tValue of the first character of the String: %c\n", s, ptr,ptr,ptr,*ptr);