当我在 main 函数外初始化结构成员时,为什么这个 c 程序会出错?
Why this c-program gives error when I initialize structure member outside the main function?
当我在 main
函数外初始化结构成员(user.username
和 user.pin
)时,为什么这个 c 程序会报错?,但是当我在函数内初始化它时一切正常main
函数。
还有什么方法可以初始化 char 数组(结构成员)?
#include <stdio.h>
typedef struct {
int pin;
char username[20];
} portal;
portal user;
// user.username = "alex";
// user.pin[20] = 1234; //Why this gives error when I intialize it here(i.e outside the main function)?
int main() {
user.username = "alex"; //How to intialize a memeber(having type char) of structure?
user.pin[20] = 1234;
printf("WELCOME TO PORTAL\n");
printf("ENTER YOUR USERNAME:\n");
scanf("%[^\n]%*c", user.username);
.
.
.
实际上,当我在 main
函数之外初始化 user.username
时,我得到了这个输出。
该结构成员已经初始化。当您在 main
之外执行此操作时,编译器可以通过直接将其设置为字符串文字来优化它。
如果输入main
,那么初始化就来不及了。编译器不假设 main
保证被调用或立即调用。因此 main
中的语句不是初始化而是赋值。您不能分配给字符数组,这就是 strcpy
和相关函数的用途。
这应该有效:
strcpy(user.username, "Alex")
或
snprintf(user.username, sizeof user.username, "Alex");
// user.username = "alex"; // user.pin[20] = 1234; //Why this gives
error when I intialize it here(i.e outside the main function)?
这不是初始化。这是赋值语句。在函数外部您只能放置声明而不是语句。
此外,即使作为陈述,它们也是不正确的。
看看你的结构定义
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" );
但是您可以在声明对象时对其进行初始化 user
。例如
portal user = { 1234, "alex" };
或
portal user = { .pin = 1234, .username = "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;
}
程序输出为
pin = 1234, user name = alex
全局变量可以初始化为定义点,但不能作为独立语句:
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] = '[=11=]';
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;
…
}
当我在 main
函数外初始化结构成员(user.username
和 user.pin
)时,为什么这个 c 程序会报错?,但是当我在函数内初始化它时一切正常main
函数。
还有什么方法可以初始化 char 数组(结构成员)?
#include <stdio.h>
typedef struct {
int pin;
char username[20];
} portal;
portal user;
// user.username = "alex";
// user.pin[20] = 1234; //Why this gives error when I intialize it here(i.e outside the main function)?
int main() {
user.username = "alex"; //How to intialize a memeber(having type char) of structure?
user.pin[20] = 1234;
printf("WELCOME TO PORTAL\n");
printf("ENTER YOUR USERNAME:\n");
scanf("%[^\n]%*c", user.username);
.
.
.
实际上,当我在 main
函数之外初始化 user.username
时,我得到了这个输出。
该结构成员已经初始化。当您在 main
之外执行此操作时,编译器可以通过直接将其设置为字符串文字来优化它。
如果输入main
,那么初始化就来不及了。编译器不假设 main
保证被调用或立即调用。因此 main
中的语句不是初始化而是赋值。您不能分配给字符数组,这就是 strcpy
和相关函数的用途。
这应该有效:
strcpy(user.username, "Alex")
或
snprintf(user.username, sizeof user.username, "Alex");
// user.username = "alex"; // user.pin[20] = 1234; //Why this gives error when I intialize it here(i.e outside the main function)?
这不是初始化。这是赋值语句。在函数外部您只能放置声明而不是语句。
此外,即使作为陈述,它们也是不正确的。
看看你的结构定义
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" );
但是您可以在声明对象时对其进行初始化 user
。例如
portal user = { 1234, "alex" };
或
portal user = { .pin = 1234, .username = "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;
}
程序输出为
pin = 1234, user name = alex
全局变量可以初始化为定义点,但不能作为独立语句:
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] = '[=11=]';
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;
…
}