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

#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);
}

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

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

Ответы на вопрос(7)

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

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

#define MAX_LENGTH 256
char st[MAX_LENGTH];

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

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

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

char st[80];

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

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

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

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

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

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

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

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

использование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]
 Registered User24 мая 2012 г., 08:12
Если я использую его как char * st, то как мне его распечатать?char *st; printf("enter string\n"); scanf("%s",st); printf("the entered string is %s\n",*st);
 24 мая 2012 г., 08:20
@aix: отредактированный ответ
 24 мая 2012 г., 08:09
Если вы собираетесь рекомендоватьchar*Также, пожалуйста, порекомендуйте способ выделить / освободить память.
 24 мая 2012 г., 08:16
@RegisteredUser: продолжайте свое решение. или вы также можете использовать printf (& quot; введенная строка% s \ n & quot;, st);
 24 мая 2012 г., 08:32
даунвотер почему даунвот? что случилось?

Ваш ответ на вопрос