所以我有一个结构体,在该结构体中我有一个用于存储电话号码的字符数组。格式为 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');
}
这是输出:
如您所见,电话号码的输出完全混乱,而且我最终也遇到了分段错误。
您应该确保编译器警告已打开。如果您没有收到警告,那么您应该确保您使用的是良好的编译器,例如 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.
这些提示您可能犯了哪些错误。
在这种情况下,您对字符和字符串有点困惑,以及其他一些问题。
解决您的字符/字符串问题:
您犯了错误,将指针传递给一个字符,而您应该只传递字符本身。要解决此问题,您应该删除&符号,更改此:
printf("%c", &studentArr[x].cellNumber[i]);
对此:
printf("%c", studentArr[x].cellNumber[i]);
对于三行中的每一行。
您可能还想首先打印“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:
您的代码中仍然存在错误。从这里开始,您应该编译并检查警告,然后搜索您得到的错误,因为它们有详细记录。
您正在使用 & 打印手机号码。不要使用 & 打印地址处的值。 & 仅用于打印地址。