【问题标题】:Why does scanf put a string into a char array while directly inputting it does not work?为什么scanf在直接输入时将字符串放入char数组中不起作用?
【发布时间】:2014-06-28 15:27:06
【问题描述】:

这个问题很难命名。

基本上我有一个具有自己结构的数组。

typedef struct Video
{
    unsigned id;
    char title[90];
    char producer[60];
}Video;

Video arrayVideo[7];

int main()
{
    scanf("%s", arrayVideo[0].title);
    printf("%s", arrayVideo[0].title);
}

此代码将打印出我在 scanf 过程中编写的任何内容。

然而,这个对 int main 的小改动;

 int main()
{
    arrayVideo[0].title[90] = ("Hello");
    printf("%s", arrayVideo[0].title);
}

什么都没有。控制台只是输出执行时间和正常业务。不输出“你好”

【问题讨论】:

  • 你需要使用strcpy()来复制数组。
  • 您是否收到有关该代码的编译警告?您正在尝试将一个字符串常量(一个指针)分配给一个字符,并在数组的末尾分配一个。
  • arrayVideo[0].title[90] 的类型是 char 并且在数组的最后一个元素旁边。

标签: c scanf


【解决方案1】:

这个问题实际上源于对指针对字符串的作用的混淆。 char title[90] 是一个存储 90 个chars 的字符数组。 title 是指向该数组第一个元素的指针,title[90] 是指向数组末尾后一个元素的指针(因为数组索引从 0 开始,title[89] 是最后一个元素)

因此,如果我们分解这一行中发生的事情:

    arrayVideo[0].title[90] = ("Hello");

左边是一个指针类型,它指向arrayVideo中的第一个元素,这是一个结构,然后在该结构中指向比title的第一个元素超过90个元素的字符,注意这个是91年代元素。右侧是const char* 类型的字符串文字。目前,此代码只是分配一个指针在数组的末尾 指向"hello" 字符串文字的开头地址。它不会像您希望的那样将字符串的内容复制到您的数据结构中。我有点惊讶您在编译时没有从编译器中收到警告,请尝试在启用所有警告的情况下进行编译。

要正确复制字符串的内容,您需要像这样使用strcpy

strcpy(arrayVideo[0].title,"hello")

这里strcpy 的目标是title 数组的开始,源来自const char* 字符串文字"hello"

【讨论】:

  • 感谢详细的解释!我似乎没有收到任何警告告诉我这让我更加困惑。你能解释一下 char* 和 char 之间的区别吗?
  • @PejmanPoh,您可能需要使用编译器启用警告,使用 gcc,这是 -Wall 标志。对于其他编译器,它将使用不同的名称,请阅读编译器的手册。 charchar* 之间的区别在于char 是一个字符,char* 是一个包含char 的内存位置。阅读有关指针的教程或介绍,这将有助于您进一步理解这里。
【解决方案2】:

第二个给你两个警告,告诉你出了什么问题:

t.c: In function ‘main’:
t.c:14:29: warning: assignment makes integer from pointer without a cast [enabled by default]
     arrayVideo[0].title[90] = ("Hello");
                             ^
t.c:14:24: warning: array subscript is above array bounds [-Warray-bounds]
     arrayVideo[0].title[90] = ("Hello");
                        ^

第一个警告告诉您,您正在尝试将指针(指向字符串 "Hello")存储到 title 数组的单个 char 中,第二个警告告诉您它无论如何都超出了范围,所以可能会做任何事情,尽管在这种情况下它可能只是写入producer 数组的第一个字符。

道德:总是启用编译器可以发出的所有警告,并注意它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2023-03-05
    相关资源
    最近更新 更多