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

标签 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

最佳答案

我理解作为新用户。但是,您应该查看 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. 解决字符/字符串问题:

    您犯了错误,将指针传递给一个字符,而您应该只传递字符本身。要解决此问题,您应该删除 & 符号,并更改此:

    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. 您的代码中仍然存在错误。从这里,您应该编译和检查警告,然后搜索您得到的错误,因为它们有详细记录。

关于c - 在 C 中使用结构数组的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879772/

相关文章:

c++ - 从 C/C++ 编码的应用程序读取输出流

c - 如何发现代码中的内存泄漏问题

c - 替代 Linux 上的 backtrace() 可以找到静态函数的符号

c++ - C代码意外成功

java - 使用匹配器和正则表达式后如何传递数组项的原始值

arrays - If 语句查找重复值?

c++ - 不能在从 vector 派生的类中交换结构

c - 在结构中使用指针和零元素数组的区别

python - 在Python中设置最大大小为n的有序分区

嵌套结构中的 JSON 解码