#include <stdio.h>
#include <string.h>
typedef struct birth{
char *name;
char time[12];
}birth;
void swap(struct birth *a, struct birth *b){
struct birth tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main(){
int n;
birth list[100], *p, *q;
scanf("%d", &n);
getchar();
for(p = list; p < list n; p ){
scanf("%s %s", &p->name, &p->time);
}
for(p = list; p < list n - 1; p ){
for(q = p 1; q < list n; q ){
if(strcmp(p->time, q->time) > 0){
swap(p ,q);
}
else if(strcmp(p->time, q->time) == 0){
if(strcmp(p->name, q->name) > 0){
swap(p ,q);
}
}
}
}
for(int i = 0; i < n; i ){
printf("%s %s\n", list[i].name, list[i].time);
}
return 0;
}
我正在解決接收n的問題,即學生人數,重復學生人數,接收學生姓名和出生日期,如果出生日期相同,則提前列印姓名。但是,沒有任何答案,于是我在vcode中使用除錯器進行了檢查,當我收到輸入時,出生日期輸入良好,但名稱卻沒有。
uj5u.com熱心網友回復:
birth list[100], *p, *q;
...
for(p = list; p < list n; p ){
scanf("%s %s", &p->name, &p->time);
}
在這里,你問的scanf保存資料&p->name并沒有為分配空間p->name。
uj5u.com熱心網友回復:
您正在嘗試使用從未初始化的字符指標讀取字串。
typedef struct birth{
char *name;
char time[12];
}birth;
...
scanf("%s %s", &p->name, &p->time); // error, &p->name points to nowhere
您應該自己分配記憶體或將其宣告為固定大小的字符陣列。最好也檢查字串邊界:
#define S_NAME 12
#define S_TIME 12
typedef struct birth{
char name[S_NAME];
char time[S_TIME];
}birth;
...
// read string with safety guard
if (fgets(p->name, S_NAME, stdin) != NULL) {
// read name successfully
}
if (fgets(p->time, S_TIME, stdin) != NULL) {
// read time successfully
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322568.html
標籤:C
