繁体   English   中英

char *和char []的scanf之间的区别?

[英]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为空)。 但是,如果我运行下面的代码,两个输入都正确存储在word1word2中。

#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 分配给word1word2指针。 当您提供输入时, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM