【问题标题】:Unexpected Output using Struct Array in C在 C 中使用 Struct Array 的意外输出
【发布时间】:2016-11-30 03:31:35
【问题描述】:

所以我有一个结构,在该结构中我有一个用于存储电话号码的字符数组。格式为 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');
}

这是输出:

如您所见,电话号码的输出完全搞砸了,我也遇到了分段错误。非常感谢任何帮助或建议。

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

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

【问题讨论】:

  • 打印单个字符使用printf("%c", studentArr[x].cellNumber[i]);,读取等级字母使用scanf("%c", &amp;studentArr[x].grade);
  • 请复制粘贴实际代码和输出,而不是图像。不是每个人都能看到图像。
  • @NickM 请参阅我评论的第二部分 - 使用 "%c" 作为字符。
  • scanf("%s", studentArr[x].grade); printf("%s", studentArr[x].grade); --> scanf(" %c", &amp;studentArr[x].grade); printf("%c\n", studentArr[x].grade);

标签: c arrays struct output


【解决方案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. 您的代码中仍有错误。从这里开始,您应该编译并检查警告,然后搜索您得到的错误,因为它们有据可查。

【讨论】:

  • 感谢您的评论!很抱歉没有在此处遵循发布指南,我将确保在下一篇文章中这样做!感谢您的建议,在您发布的内容和其他用户发布的内容之间,我的代码正常工作。非常感谢,先生!
  • 没问题。此外,如果解决方案对您有帮助,请随时将答案标记为已接受,以便其他人知道此问题有答案。
【解决方案2】:

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

【讨论】:

  • 不,它也可以用来打印字符串。
  • @Ken Y-N 你的成绩是 char 类型的,你为什么用℅s来输入。使用℅c。这是段错误的问题
  • @SumitGemini 感谢您的评论。是的,我已切换到 %c 而不是 %s。现在我得到的是输出字母而不是数字,提示也被绕过了。编辑后的图像见 OP。
  • @KenY-N 您是否对我的回答投了反对票,为什么?您的 cellNumber 是字符数组“char cellNumber[10]”。现在您正在从用户那里获得输入。 scanf("%s", studentArr[x].cellNumber);并试图从地址读取数据?怎么可能? printf("%c", &studentArr[x].cellNumber[1]);你应该使用 printf("%c", studentArr[x].cellNumber[1]);打印字符。为了您的知识 char s[11] 这里 s 是 &s[0] 并且因为 s 已经是一个地址。
猜你喜欢
  • 2023-01-30
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 2021-10-13
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多