我如何使用prinf Struct数组?

时间:2016-01-12 02:33:29

标签: c

我正在尝试从2个数组中打印结构中的值,但输出非常奇怪,我不知道为什么。

这是什么? C123 6545645 bvabc123 vabc123 abc132

应该宣布: 约翰 47 汽车 沃尔沃 ABC123

什么不对?

struct person{
    char name;
    int age;
};
typedef struct person p;

struct vehicle{
    char type;
    char brand;
    char regn;
    char owner;
};
typedef struct vehicle v;

int main(){
    p owner[1];
    v Vehicle[1];

    for(int i=0; i<1;i++){
        printf("Name\n");
        scanf("%s",&owner[i].name);
        printf("Age\n");
        scanf("%d",&owner[i].age);
        printf("Type\n");
        scanf("%s",&Vehicle[i].type);
        printf("Brand\n");
        scanf("%s",&Vehicle[i].brand);
        printf("regn\n");
        scanf("%s",&Vehicle[i].regn);


    }

    for(int j=0; j<1; j++){
        printf("%s\n", &owner[j].name);
        printf("%d\n", &owner[j].age);
        printf("%s\n", &Vehicle[j].type);
        printf("%s\n", &Vehicle[j].brand);
        printf("%s\n", &Vehicle[j].regn);
    }

}

3 个答案:

答案 0 :(得分:1)

C中的char字面意思是单个字符。 char只是一个带符号的8位整数。因此,当您在代码中编写char时,您告诉C您正在存储一个8位整数 - 仅此而已。另一方面,字符串由许多字符组成,其中每个字符是8位整数(即a char)。在C中,字符串作为连续的8位整数存储在内存(数组)中,其中数组的长度比字符串的长度多一个,并且数组末尾的这个额外元素是空终止符(单个字节,只是一个0)。由于字符串可以是任意长度,我们需要知道它们有多长(即内存中的数组结束的位置)。 C通过在字符串的末尾使用此null终止符来完成此操作。

在您的代码中,当您在结构定义中编写char时,您告诉C只存储单个字符。你想要的是char *(指向char的指针),它指向一个char s数组,其中最后一个元素是空终止符。如果在分配字符串时使用双引号,C会为您插入此终止符。

你想要的是这样的:

typedef struct person {
  char *name;
  // ...
} p;

int main(int argc, char *argv[]) {
  p person;
  person.name = "The name";
  printf("%s\n", person.name); // Prints `The name`
}

答案 1 :(得分:1)

问题是char应该是单个字符,例如'a''B''1'等。所以你需要的是一系列的。下面我随意选择32作为数组的长度

请注意,我从代码中的多个位置删除了&,因为它现在使用数组而不是单个字符:

#include <stdio.h>

struct person {
    char name[32];
    int age;
};
typedef struct person p;

struct vehicle {
    char type[32];
    char brand[32];
    char regn[32];
    char owner[32];
};
typedef struct vehicle v;

int main(){
    p owner[1];
    v Vehicle[1];

    for (int i = 0; i < 1; i++) {
        printf("Name\n");
        scanf("%s", owner[i].name);
        printf("Age\n");
        scanf("%d", &owner[i].age);
        printf("Type\n");
        scanf("%s", Vehicle[i].type);
        printf("Brand\n");
        scanf("%s", Vehicle[i].brand);
        printf("regn\n");
        scanf("%s", Vehicle[i].regn);
    }

    for (int j = 0; j < 1; j++) {
        printf("%s\n", owner[j].name);
        printf("%d\n", owner[j].age);
        printf("%s\n", Vehicle[j].type);
        printf("%s\n", Vehicle[j].brand);
        printf("%s\n", Vehicle[j].regn);
    }
}

另请注意,如果用户输入溢出存储空间32的字符串,则此代码将导致未定义的行为,因为它不会检查该字符串。此外,如果用户为任何会导致问题的scanf输入空格。如果这对您很重要,可以找到解决方案:How do you allow spaces to be entered using scanf?

答案 2 :(得分:1)

首先,对于name,type,brand和regn变量,它们是字符串,因此您应该使用char数组来定义它们。

其次,你不应该使用&amp;在scanf函数中,当变量是数组时; 最后,你不应该使用&amp;在printf函数中。

最后,你不应该使用&amp;在printf函数中。

scanf("%s",owner[i].name);
printf("%s\n",owner[j].name);