Проблема при печати строки с использованием указателей в программировании на C - PullRequest
0 голосов
/ 14 ноября 2018

Уважаемые эксперты,

Я новичок в языке программирования Си.

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

Я приложил скриншот кода, который я пытаюсь выполнить.

Пожалуйста, помогите мне.

#include<stdio.h>

int main()
{
    char str[20];
    char *pt;

    printf("Enter any string :\n");
    gets(str);
    pt=&str[0];

    for(*pt=0; *pt != '\0'; *pt++)
    {
        printf("%c", *pt);
    }
}

Ответы [ 2 ]

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

Первый - НИКОГДА НЕ НИКОГДА используйте gets, даже в коде игрушки.Он устарел в стандарте 1999 года и был удален из стандартной библиотеки по стандарту 2011 года.Это будет вводить точку отказа / серьезную дыру в безопасности вашего кода.Вместо этого используйте fgets, просто имейте в виду, что новая строка будет сохранена в вашем буфере, если есть место.

Перестройте ваш оператор for следующим образом:

for ( pt = str; *pt != '\0'; pt++ )

Первое выражение устанавливает pt, чтобы указывать на первый символ в str (в этом контексте str - этоэквивалентно &str[0]).Вторая сравнивает значение элемента, на который указывает pt, с ограничителем строки.Поскольку вы пытаетесь проверить значение указанного объекта, вы должны использовать оператор * для определения значения pt.Окончательное выражение увеличивает pt, чтобы указывать на следующий символ в строке.

Наконец, есть ли причина, по которой вы печатаете строку символ за символом, а не просто пишете printf( "%s\n", str );?

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

Инициализация *pt = 0; вызывает немедленный сбой теста продолжения *pt != 0, поэтому ваш цикл останавливается перед печатью чего-либо.

Вы уже инициализировали pt перед циклом, поэтому вам не нужноэтот шаг в заголовке for().И вы должны увеличивать указатель, а не символ, на который он указывает, поэтому обновление должно быть pt++.

for (; *pt != '\0'; pt++) {
    printf("%c", *pt);
}

Кстати, ptr = &str[0]; можно упростить до ptr = str;.Также более идиоматично помещать это в заголовок for, поэтому это будет:

for (pt = str; *pt != '\0'; pt++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...