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

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

4

7 回答 7

11

char st是单个字符。从您的其余代码来看,您可能打算声明一个字符数组:

char st[80];
于 2012-05-24T06:08:28.093 回答
1

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

你需要一个数组:

#define MAX_LENGTH 256
char st[MAX_LENGTH];

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

于 2012-05-24T06:08:27.363 回答
1

scanf需要一个指针来char*指示您正在扫描字符串。

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

您要么想使用 agetchar()要么制作st一个 char 数组。

于 2012-05-24T06:13:05.427 回答
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]
于 2012-05-24T06:09:04.233 回答
0

st 是 char 的类型 &st 是 char 的类型 * 注意区别。顺便说一句,只有一个字符不能用于存储字符串。使用 char[] 数组。

于 2012-05-24T06:11:37.627 回答
0

正如其他人提到的那样,您想要创建一个数组:

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

进行上述更改st的是一个数组,它有 10 个单独的元素,可以保存一个 char 值。

于 2012-05-24T06:21:32.583 回答
0

char st 是一个字符,即它只会存储一个字符 像这样尝试它 main() char st [100]; scanf("%s",st); 只需更改这三行,它将起作用,除了这里只有单个单词字符串您已将函数声明为 int,即 int main() 保持它为main() 它将工作

于 2012-05-24T07:57:30.147 回答