[英]Difference between scanf for char * and char [ ]?
我是 c 编程的新手。 我正在尝试使用scanf
输入两个字符串。 我的第一次尝试如下
#include <stdio.h>
int main(void)
{
char *word1;
char *word2;
scanf("%s", word1);
scanf("%s", word2);
printf("%s\n", word1);
printf("%s\n", word2);
}
如果我运行此代码,则只有第一个输入被正确存储( word2
为空)。 但是,如果我运行下面的代码,两个输入都正确存储在word1
和word2
中。
#include <stdio.h>
int main(void)
{
char word1[10];
char word2[10];
scanf("%9s", word1);
scanf("%9s", word2);
printf("%s\n", word1);
printf("%s\n", word2);
}
使用带有scanf
的指针有什么问题?
原则上使用指针作为scanf
参数没有问题。 在您的特定情况下,您根本没有初始化这些指针,因此您会导致未定义的行为。 修改您的第二个(正确)示例以使用指针:
#include <stdio.h>
int main(void)
{
char word1[10];
char *p1 = word1;
char word2[10];
char *p2 = word2;
scanf("%9s", p1);
scanf("%9s", p2);
printf("%s\n", p1);
printf("%s\n", p2);
}
关于指针要记住的重要一点是它们必须指向某些东西才能有用。
将指针与 scanf 一起使用有什么问题?
第一个是未定义的行为。 看这部分代码:
char *word1;
char *word2;
scanf("%s", word1);
scanf("%s", word2);
没有 memory 分配给word1
和word2
指针。 当您提供输入时, scanf()
最终会访问未分配的指针,并且取消引用未分配/无效的指针是未定义的行为。
您应该确保在使用/访问指针之前,它应该指向一个有效的 memory 位置。 您可以将其指向现有的有效 memory 或动态分配 memory 给它,如下所示:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *word1;
char *word2;
word1 = malloc (10);
if (word1 == NULL) {
exit (EXIT_FAILURE); // or whatever you want to do to handle memory allocation failure
}
word2 = malloc (10);
if (word2 == NULL) {
exit (EXIT_FAILURE); // or whatever you want to do to handle memory allocation failure
}
scanf("%9s", word1);
scanf("%9s", word2);
printf("%s\n", word1);
printf("%s\n", word2);
// once done with allocated memory, free it
free (word1);
free (word2);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.