Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么这个c程序在初始化主函数外部的结构成员时出错?_Arrays_C_Struct_Initialization_C Strings - Fatal编程技术网

Arrays 为什么这个c程序在初始化主函数外部的结构成员时出错?

Arrays 为什么这个c程序在初始化主函数外部的结构成员时出错?,arrays,c,struct,initialization,c-strings,Arrays,C,Struct,Initialization,C Strings,为什么当我在main函数外部初始化结构成员(user.username和user.pin)时,这个c程序会出错?但是当我在main函数内部初始化它时,一切都会变好 还有什么方法可以初始化字符数组(结构的成员) #包括 类型定义结构{ int引脚; 字符用户名[20]; }入口; 门户用户; //user.username=“alex”; //user.pin[20]=1234//为什么我在这里初始化它时会出现错误(即在主函数之外)? int main(){ user.username=“alex

为什么当我在
main
函数外部初始化结构成员(
user.username
user.pin
)时,这个c程序会出错?但是当我在
main
函数内部初始化它时,一切都会变好

还有什么方法可以初始化字符数组(结构的成员)

#包括
类型定义结构{
int引脚;
字符用户名[20];
}入口;
门户用户;
//user.username=“alex”;
//user.pin[20]=1234//为什么我在这里初始化它时会出现错误(即在主函数之外)?
int main(){
user.username=“alex”//如何初始化结构的memeber(具有类型char)?
user.pin[20]=1234;
printf(“欢迎访问门户网站”);
printf(“输入您的用户名:\n”);
scanf(“%[^\n]%*c”,user.username);
.
.
.
实际上,当我在
main
函数外部初始化
user.username
时,我得到了这个输出


该结构成员已初始化。当您在
main
外部执行此操作时,编译器可以通过将其直接设置为字符串文本来优化它

如果输入了
main
,那么初始化就太晚了。编译器不会假设
main
保证立即被调用或调用。因此
main
中的语句不是初始化而是赋值。不能赋值给字符数组,这就是
strcpy
和r相关功能适用于

这应该起作用:

strcpy(user.username, "Alex")


该结构成员已初始化。当您在
main
外部执行此操作时,编译器可以通过将其直接设置为字符串文本来优化它

如果输入了
main
,那么初始化就太晚了。编译器不会假设
main
保证立即被调用或调用。因此
main
中的语句不是初始化而是赋值。不能赋值给字符数组,这就是
strcpy
和r相关功能适用于

这应该起作用:

strcpy(user.username, "Alex")

//user.username=“alex”//user.pin[20]=1234;//这是为什么 在此处初始化时出错(即在主函数之外)

这不是初始化。这是赋值语句。在函数外部,只能放置声明,不能放置语句

此外,即使是声明,它们也是不正确的

看看你的结构定义

typedef struct
{
 int pin;
 char username[20];
}portal;
数据成员
pin
的类型为
int
。它不是数组。因此此赋值

user.pin[20] = 1234;
没有道理。你至少应该像这样写

user.pin = 1234;
另一方面,数据成员
username
是一个字符数组。数组没有赋值运算符。您必须将字符串复制到字符数组中。例如

#include <string.h>

//...

strcpy( user.username, "alex" );
portal user = { 1234, "alex" };

这是一个演示程序

#include <stdio.h>

typedef struct
{
    int pin;
    char username[20];
} portal;

portal user = { .pin = 1234, .username = "alex" };

int main(void) 
{
    printf( "pin = %d, user name = %s\n", user.pin, user.username );

    return 0;
}
//user.username=“alex”//user.pin[20]=1234;//这是为什么 在此处初始化时出错(即在主函数之外)

这不是初始化。这是赋值语句。在函数外部,只能放置声明,不能放置语句

此外,即使是声明,它们也是不正确的

看看你的结构定义

typedef struct
{
 int pin;
 char username[20];
}portal;
数据成员
pin
的类型为
int
。它不是数组。因此此赋值

user.pin[20] = 1234;
没有道理。你至少应该像这样写

user.pin = 1234;
另一方面,数据成员
username
是一个字符数组。数组没有赋值运算符。您必须将字符串复制到字符数组中。例如

#include <string.h>

//...

strcpy( user.username, "alex" );
portal user = { 1234, "alex" };

这是一个演示程序

#include <stdio.h>

typedef struct
{
    int pin;
    char username[20];
} portal;

portal user = { .pin = 1234, .username = "alex" };

int main(void) 
{
    printf( "pin = %d, user name = %s\n", user.pin, user.username );

    return 0;
}

全局变量可以初始化为定义点,但不能初始化为独立语句:

portal user = { 1234, "alex" };  // definition with an initializer

user.pin = 1234;        // assignment is invalid outside a function
user.username = "Alex"; // assignment is invalid outside a function and assigning to an array is invalid as well
可以在函数内设置结构成员,但不能使用
=
运算符分配数组内容,您需要显式分配数组元素或使用函数调用:

int main() {
    char extra[20];

    user.pin = 1234;         // OK

    user.username[0] = 'A';  // tedious, but OK
    user.username[0] = 'l';
    user.username[0] = 'e';
    user.username[0] = 'x';
    user.username[0] = '\0'; 

    strcpy(user.username, "Alex"); // OK if username has at least 5 elements

    snprintf(user.username, sizeof user.username, "%s", "Alex"); // overkill, but OK

    // read values from stdin:
    // scanf will return the number of members successfully converted:
    switch (scanf("%d%19s%19[^\n]", &user.pin, user.username, extra)) {
      case EOF:
        printf("premature end of file\n");
        break;
      case 0:
        printf("input is not a number for user.pin\n");
        break;
      case 1:
        printf("user.pin=%d, no input for user.username\n", user.pin);
        break;
      case 2:
        printf("user.pin=%d, user.username=%s\n", user.pin, user.username);
        break;
      case 3:
        printf("user.pin=%d, user.username=%s, extra input=%s\n", user.pin, user.username, extra);
        break;
    }
    return 0;
}

全局变量可以初始化为定义点,但不能初始化为独立语句:

portal user = { 1234, "alex" };  // definition with an initializer

user.pin = 1234;        // assignment is invalid outside a function
user.username = "Alex"; // assignment is invalid outside a function and assigning to an array is invalid as well
可以在函数内设置结构成员,但不能使用
=
运算符分配数组内容,您需要显式分配数组元素或使用函数调用:

int main() {
    char extra[20];

    user.pin = 1234;         // OK

    user.username[0] = 'A';  // tedious, but OK
    user.username[0] = 'l';
    user.username[0] = 'e';
    user.username[0] = 'x';
    user.username[0] = '\0'; 

    strcpy(user.username, "Alex"); // OK if username has at least 5 elements

    snprintf(user.username, sizeof user.username, "%s", "Alex"); // overkill, but OK

    // read values from stdin:
    // scanf will return the number of members successfully converted:
    switch (scanf("%d%19s%19[^\n]", &user.pin, user.username, extra)) {
      case EOF:
        printf("premature end of file\n");
        break;
      case 0:
        printf("input is not a number for user.pin\n");
        break;
      case 1:
        printf("user.pin=%d, no input for user.username\n", user.pin);
        break;
      case 2:
        printf("user.pin=%d, user.username=%s\n", user.pin, user.username);
        break;
      case 3:
        printf("user.pin=%d, user.username=%s, extra input=%s\n", user.pin, user.username, extra);
        break;
    }
    return 0;
}

在C语言中,函数之外只能有声明和预处理器指令。源文本
user.username=“alex”
是一条语句,就像
user.pin[20]=1234;
一样。出现编译器错误消息是因为编译器需要声明,而您的语句不符合它的要求

要在定义对象时对其进行初始化,可以使用语法对其进行初始化,而不是编写单独的语句。
user
可以使用以下任一方法进行定义和初始化:

portal user = { "alex", 1234 };
portal user = { .username = "alex", .pin = 1234 };
虽然定义在初始化中使用
=
,但这不是赋值。它是对
=
符号的不同使用,以获得类似效果(将此值放在该位置)。另一个区别是,在初始化中,可以使用字符串文字来初始化字符数组。在语句中,不能使用

另一种给
user
提供初始值的方法是在
main
中编写语句:

int main(void)
{
    strcpy(user.username, "alex");
    user.pin = 1234;
    …
}

在C语言中,函数之外只能有声明和预处理器指令。源文本
user.username=“alex”
是一条语句,就像
user.pin[20]=1234;
一样。出现编译器错误消息是因为编译器需要声明,而您的语句不符合它的要求

要在定义对象时对其进行初始化,可以使用语法对其进行初始化,而不是编写单独的语句。
user
可以使用以下任一方法进行定义和初始化:

portal user = { "alex", 1234 };
portal user = { .username = "alex", .pin = 1234 };
虽然def