Как я могу использовать символьный указатель и ввести в него строку? - PullRequest
0 голосов
/ 07 февраля 2019

Есть ли способ сделать это без с использованием динамического выделения памяти?

#include <stdio.h>

int main() {
    char* str = NULL;
    scanf("%s", str);
    printf("%s\n", str);
}

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Не существует простого способа в соответствии со стандартом C (C11), однако, POSIX определяет необязательный символ присваивания-выделения m как часть спецификатора преобразования, что облегчает работу программистаот ответственности за выделение памяти.

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

Цитировать ссылку:

Спецификаторы преобразования %c, %s и %[ должны принимать необязательный символ присваивания-выделения 'm', который должен вызывать выделение буфера памяти для хранения преобразованной строки, включая завершающий нулевой символ.В таком случае аргумент, соответствующий спецификатору преобразования, должен быть ссылкой на переменную-указатель, которая получит указатель на выделенный буфер.Система должна выделить буфер, как если бы был вызван malloc().Приложение несет ответственность за освобождение памяти после использования.Если памяти недостаточно для выделения буфера, функция должна установить errno в [ENOMEM], и в результате возникнет ошибка преобразования.Если функция возвращает EOF, любая память, успешно выделенная для параметров с использованием символа присвоения-выделения 'm' этим вызовом, должна быть освобождена до возврата функции.

Что-то вроде

#include <stdio.h>
#include <stdlib.h>

int main() {
    char* str = NULL;
    scanf("%ms", &str);
    printf("%s\n", str);
    free(str);

    return 0;
}

сделает работу.

0 голосов
/ 07 февраля 2019

Да, но вы собираетесь тратить память или риск нарушения сегментации:

#include <stdio.h> 
int main() { 
     char str[512] = {0} // as suggested by Jabberwocky
     //sprintf(str, "");
     //scanf("%s", str); // protecting the input from more than 511 chars
     scanf("%511s", str);
     printf("%s\n", str); 
}
0 голосов
/ 07 февраля 2019

Таким образом:

int main()
{
  char str[100];
  scanf("%s", str);
  printf("%s\n", str);
}
...