为什么scanf将字符串放入char数组,而直接输入它不起作用?

时间:2014-06-28 15:27:06

标签: c scanf

很难对问题进行标题。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

因此,如果我们分解这一行中的内容:

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

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

要实际正确复制字符串的内容,您需要使用strcpy,如下所示:

"hello"

此处strcpy(arrayVideo[0].title,"hello") 的目的地是strcpy数组的开始,来源来自title字符串文字const char*

答案 1 :(得分: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")存储到char数组的单个title中,第二个告诉您它无论如何都是出界的,所以可能会做任何事情,尽管在这种情况下它可能只是写入producer数组的第一个字符。

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