Вопрос по c – формат "% s" ожидает аргумент типа "char *"

13
#include <stdio.h>
int main(void)
{
    int i,j,k;
    char st;
    printf("enter string\n");
    scanf("%s", st);
    printf("the entered string is %s\n", st);
}

Компиляция вышеуказанной программы дает мне предупреждение:

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat]
palindrom.c:8:1: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'int' [-Wformat]

Что я здесь не так делаю?

Вот что происходит, когда я запускаю его:

$ ./a.out
enter string
kiaaa
the entered string is (null)

Edit:

Вот еще одна версия кода (сделаноchar st; вchar *st):

#include <stdio.h>
int main(void)
{
    int i,j,k;
    char *st;
    printf("enter string\n");
    scanf("%s", st);
    printf("the entered string is %s\n", st);
}

Тем не менее, он ведет себя так же во время выполнения.

Теперь вашchar *st; неинициализированный указатель Вы не знаете, куда это указывает. Доступ к нему вscanf является неопределенным поведением. Вы должны указать на достаточно большой кусок действительной памяти. Либо объявить массивchar st[100]; - имя массива преобразуется в указатель при передаче в качестве аргументаscanf или жеprintf, так что все в порядке - или объявить его как указатель, как у вас, и выделить немного памяти,st = malloc(100 * sizeof *st); перед его использованием. Тебе нужно#include <stdlib.h> заmallocи проверьте,malloc возвращенныйNULL. Daniel Fischer

Ваш Ответ

7   ответов
9

char st это один символ Судя по остальной части вашего кода, вы, вероятно, намеревались объявить массив символов:

char st[80];
0

st это тип символа & amp; st - тип символа * Позаботься о разнице. Кстати, только один символ не может быть использован для хранения строки. Используйте массив char [].

0

char st это символ, т.е. он будет хранить только один символ, попробуйте так main() char st [100]; scanf("%s",st); просто измените эти три строки, и это будет работать, за исключением только строк одного слова здесь вы объявили функцию как int, то есть int main (), оставьте ее как main (), и она будет работать

1

scanf нужен указатель наchar* чтобы указать, что вы сканируете строку.

Вы предоставляете символ, который размещен в стеке.

Вы либо хотите использоватьgetchar() или сделатьst массив символов.

1

У вас несоответствие типов.
scanfне является безопасным типом, вы должны предоставить правильный тип.scanf позволяет вам получать данные из ввода, и вам нужно указать тип данных, которые вы хотите прочитать. Вы просите его прочитать строку, указав%s предоставив ему символьную переменную.

Вам нужен массив:

#define MAX_LENGTH 256
char st[MAX_LENGTH];

Как справедливо отмечает @Jerry, вы можете просто избежать всех хлопот, используя:
getline() Вместо того, чтобы использоватьscanf

@JerryCoffin: Хорошо, указал. Спасибо
... а затем укажите максимальную длину при вызовеscanf - как есть, звонок только%s вместо чего-то вроде%255s примерно эквивалентно звонкуgets.
Это, конечно, не предназначалось для того, чтобы рекомендовать кому-либо использоватьgets (Когда-либо)!
@JerryCoffin: Хм .. да .. поскользнулся.
0

Как уже упоминали другие, вы хотите создать массив:

+ Изменитьchar st; вchar st[10]; или массив любого размера, который вы хотите.

С вышеуказанным изменениемst это массив, который имеет 10 отдельных элементов, которые могут содержать одно значение символа.

-1

использованиеchar *st; или массив какchar st[50];.

Когда вы завершите использование указателя на символ, вы должны освободить память, используемую указателем. Это можно сделать с помощьюfree(st); функция.

РЕДАКТИРОВАТЬ: Поскольку вы печатаете строку и если вы используете указатель, вы можете сделать:

printf("the entered string is %s\n",st);
printf("the entered string is %s\n",*st); // This will work in both cases, if you use char *st or char st[50]
Если я использую его как char * st, то как мне его распечатать?char *st; printf("enter string\n"); scanf("%s",st); printf("the entered string is %s\n",*st); Registered User
@aix: отредактированный ответ
Если вы собираетесь рекомендоватьchar*Также, пожалуйста, порекомендуйте способ выделить / освободить память.
@RegisteredUser: продолжайте свое решение. или вы также можете использовать printf (& quot; введенная строка% s \ n & quot;, st);
даунвотер почему даунвот? что случилось?

Похожие вопросы