格式'%s'需要'char *'类型的参数

时间:2012-05-24 06:07:00

标签: c

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

修改

以下是代码的另一个版本(将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);
}

但是,它在运行时的行为相同。

7 个答案:

答案 0 :(得分:10)

char st是一个单一字符。根据其余代码判断,您可能想要声明一个字符数组:

char st[80];

答案 1 :(得分:1)

您的类型不匹配。
scanf不是类型安全的,您需要提供正确的类型。 scanf使您能够从输入中获取数据,并且需要告诉它您希望它读取的数据类型。您要求它通过指定%s来读取字符串,并为其提供字符变量。

你需要一个数组:

#define MAX_LENGTH 256
char st[MAX_LENGTH];

正如@Jerry正确指出的那样,你可以通过使用简单地避免所有的麻烦:
getline(),而非使用scanf

答案 2 :(得分:1)

scanf需要指向char*的指针,表示您正在扫描字符串。

您正在提供在堆栈上分配的字符。

您要么使用getchar()要么使st成为char数组。

答案 3 :(得分:0)

使用char *st;或类似char st[50];的数组。

当您完成char指针的使用时,您应该释放指针使用的内存。这可以使用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]

答案 4 :(得分:0)

st是char的类型 &amp; st是char *的类型 照顾差异。 顺便说一下,只有一个char不能用来存储字符串。使用char [] array。

答案 5 :(得分:0)

正如其他人所说,你想创建一个数组:

char st;更改为char st[10];或您想要的任何大小的数组。

通过上述更改st是一个包含10个单独元素的数组,可以保存单个char值。

答案 6 :(得分:0)

char st是一个字符,即它只存储一个字符,就像这样 main() char st [100]; scanf("%s",st); 只需更改这三行,除了单个字符串外,它将起作用 在这里你已经将函数声明为一个int,它是int main()保持为main()并且它将起作用