在结构内使用字符串

时间:2017-08-27 10:24:56

标签: c arrays string

struct employee
{
    char name[20];
}emp;

void main()
{
    emp.name[20]="John";
    printf("%s\n",emp.name);
}

为什么这段代码没有输出? 为什么不能直接初始化字符串数组?

3 个答案:

答案 0 :(得分:4)

首先:您的编译器应警告您。如果您使用gcc,请尝试使用

进行编译
gcc -std=c11 -Wall -Wextra -pedantic

并看到。

问题是语法错误。您将字符串文字分配给emp.name[20] emp.name第21个元素。此元素甚至不存在,并且类型为char

你想要的是:

emp.name = "John"; // <- INVALID!!

但是这不起作用,因为C很遗憾不允许分配给数组。您可以使用函数strcpy(字符串副本)来实现您想要的功能(包括string.h):

strcpy(emp.name, "John");

答案 1 :(得分:2)

声明emp.name[20]="John";有一些问题。目的似乎是将字符串"John"分配给字符数组emp.name。但是,您无法分配给字符数组(您可以初始化它们)。 "John"是一个字符串文字,它在赋值表达式中衰减为指向char数组的第一个元素的指针,因此该语句试图将指向char的指针赋值给{ {1}},无论如何都不是字符数组,但它是emp.name[20],除了char是一个尝试的越界数组访问。请记住,数组在C中是零索引的,因此数组的第一个元素是emp.name[20],最后一个索引是emp.name[0]。最后,即使这个赋值是数组的有效元素,你也不一定要指向emp.name[19]的指针。

一种解决方案是将char设为emp本地,并使用初始值设定项。请注意,main()的函数签名应为main()int main(void)之一;此处的任何其他函数签名都是依赖于实现的。另外,我假设原始代码不会忘记int main(int argc, char **argv)

#include <stdio.h>

或者,您可以在不更改#include <stdio.h> struct employee { char name[20]; }; int main(void) { struct employee emp = { .name = "John" }; printf("%s\n",emp.name); return 0; } 的情况下使用strcpy()。这种方法的一个缺点是你必须小心不要试图复制大于emp的字符串:

emp.name[]

指定的初始值设定项也可以在原始#include <stdio.h> #include <string.h> struct employee { char name[20]; } emp; int main(void) { strcpy(emp.name, "John"); printf("%s\n",emp.name); return 0; } 的文件范围内使用,如下所示:

struct

答案 2 :(得分:1)

Emp.name [20]取数组名称的第20位的索引。所以它会引发错误。 你可以用这种方式写你的代码      的strcpy()

 #include <stdio.h>
 #include<string.h>
 struct employee
 {
      char name[20];
 }emp;

void main()
{
    // emp.name="John";
     strcpy(emp.name,"john");
      printf("%s\n",emp.name);
 }