在C中使用结构数组的意外输出

时间:2016-11-30 03:31:36

标签: c arrays struct output

所以我有一个结构体,在该结构体中,我有一组字符,用于存储电话号码。格式为xxxxxxxxxx(x为0-9的数字)。然后,我正在运行for循环,以便在打印时格式化这十个数字的显示。

 #include <stdio.h>


void clear(void);

struct Student {
    int idNumber;
    char firstName[25];
    char lastName[25];
    char cellNumber[15];
    char grade, grade2;
    char semester[11], semester2[11];
    char course[10], course2[10];
};

int main() {

    struct Student studentArr[2];

    for (int x = 0; x < 2; x++){

        printf("For student %d...\n", x+1);
        printf("Enter student number: \n");
        scanf("%d", &studentArr[x].idNumber);
        printf("%d", studentArr[x].idNumber);
        printf("Enter student's first name: \n");
        scanf("%s", studentArr[x].firstName);
        printf("%s", studentArr[x].firstName);
        printf("Enter student's last name: \n");
        scanf("%s", studentArr[x].lastName);
        printf("%s", studentArr[x].lastName);
        printf("Enter student's cell number: \n");
        scanf("%s", studentArr[x].cellNumber);
        printf("%c", &studentArr[x].cellNumber[1]);
        printf("(");
        //print("%s", studentArr[x].cellNumber);
        for(int i = 0; i < 3; i++) {
            printf("%s", &studentArr[x].cellNumber[i]);}
        printf(")");
        for(int i = 3; i < 6; i++){
            printf("%s", &studentArr[x].cellNumber[i]);}
        printf("-");
        for(int i = 6; i < 10; i++){
            printf("%s", &studentArr[x].cellNumber[i]);}
        printf("Enter course %d: \n", x+1);
        scanf("%s", studentArr[x].course);
        printf("%s", studentArr[x].course);
        printf("Enter semster for course %d: \n", x+1);
        scanf("%s", studentArr[x].semester);
        printf("%s", studentArr[x].semester);
        printf("Enter letter grade for course %d: \n", x+1);
        scanf("%s", studentArr[x].grade);
        printf("%s", studentArr[x].grade);
        clear();

    }

}

void clear(void) {

    while(getchar() != '\n');
}

这是输出: Output

正如您所看到的,电话号码的输出完全搞砸了,我最后还是出现了分段错误。任何帮助或建议都完全赞赏。

FWIW,我是一个新手,所以不要太苛刻:)

编辑:将%s切换到%c,现在得到此输出而不提示用户输入: Letters instead of numbers

2 个答案:

答案 0 :(得分:1)

我理解成为新用户。但是,您应该查看StackOverflow的How to ask?指南,了解在之前应该做什么在StackOverflow上发布问题。但是,为了帮助SO的新用户:

您应确保打开编译器警告。如果你没有得到警告,那么你应该确保你使用像Clang这样的好编译器。

编译代码时,我遇到了这些错误:

$cc phone.c -o phone
phone.c:34:22: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
        printf("%c", &studentArr[x].cellNumber[1]);
                ~~   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
                %s
phone.c:52:21: warning: format specifies type 'char *' but the argument has type 'int' [-Wformat]
        scanf("%s", studentArr[x].grade);
               ~~   ^~~~~~~~~~~~~~~~~~~
phone.c:53:22: warning: format specifies type 'char *' but the argument has type 'char' [-Wformat]
        printf("%s", studentArr[x].grade);
                ~~   ^~~~~~~~~~~~~~~~~~~
                %c
3 warnings generated.

这些可以帮助您了解可能所犯的错误。

在这种情况下,您在字符和字符串之间会有一些混淆,以及其他一些问题。

  1. 修复你的角色/字符串问题:

    您犯了一个错误,即将指针传递给您应该只传递char本身的字符。要解决这个问题,你应该删除&符号,改变它:

    printf("%c", &studentArr[x].cellNumber[i]);
    

    到此:

    printf("%c", studentArr[x].cellNumber[i]);
    

    对于你的三行中的每一行。

  2. 您可能还想首先打印'1',而不是电话字符串的索引1(否则输入5555555555输出5(555)555-5555)。

    所以,改变一下:

    printf("%c", &studentArr[x].cellNumber[1]);
    

    到此:

    printf("%c", '1');    // or printf("1");
    

    执行#1和#2后,您将获得如下输出:

    gregEnter student's last name: 
    schmit
    schmitEnter student's cell number: 
    6306089561
    1(630)608-9561Enter course 1:
    
  3. 您的代码中仍然存在错误。从这里开始,你应该编译并检查警告,然后搜索你得到的错误,因为它们都有详细记录。

答案 1 :(得分:-2)

您正在使用&amp;打印单元格编号。不要使用&amp;在地址打印值。 &安培;仅用于打印地址。