Подтвердить что ты не робот

Может ли указатель на строку использоваться в 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, я фактически работаю с первым элементом, а не с адресом. Спасибо.

4b9b3361

Ответ 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);