C中strcmp和结构元素的问题
Problems with strcmp and element of a struct in C
我正在将普通 scanf 输入的字符串与结构中的字符串进行比较。
这是结构:
typedef struct{ // Tipo giocatore e i suoi dati
int id;
char * nome;
char * cognome; //<--------- this one (it means surname)
int eta;
char * ruolo;
squadra team;
char * college;
int td;
} giocatore;
这是有效和无效的代码 (?.?)。我不知道为什么有时它有效而有时却无效,因为这是开关的第二种情况,它与第一种情况具有相同的代码,但使用单词 "name" 而不是 "surname".请记住,第一个案例每次都有效,第二个案例是选择(lol),最后一个案例(第三个)包含我之前解释过的第一个问题。
size_t ricerca(short int tipo, size_t sz, giocatore array[]){
size_t count = 0;
char cerca;
switch(tipo){
case 1:
printf ("Inserisci il nome da cercare: ");
scanf ("%s", &cerca);
for (size_t i = 0; i < sz; ++i){
if (strcmp(array[i].nome, &cerca) == 0){
printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
array[i].id,
array[i].nome,
array[i].cognome,
array[i].eta,
array[i].ruolo,
array[i].team.nome,
array[i].college);
count++;
}
}
break;
case 2:
printf ("Inserisci il cognome da cercare: ");
scanf ("%s", &cerca);
for (size_t i = 0; i < sz; ++i){
if (strcmp(array[i].cognome, &cerca) == 0){
printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
array[i].id,
array[i].nome,
array[i].cognome,
array[i].eta,
array[i].ruolo,
array[i].team.nome,
array[i].college);
count++;
}
}
break;
case 3:
goto Cleanup;
Cleanup: ;
char nomesq[30];
printf ("Inserisci il nome della squadra da cercare: ");
scanf("%[^\n]%*c", nomesq);
for (size_t i = 0; i < sz; ++i){
if (strcmp(array[i].team.nome, nomesq) == 0){
printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
array[i].id,
array[i].nome,
array[i].cognome,
array[i].eta,
array[i].ruolo,
array[i].team.nome,
array[i].college);
count += 1;
}
}
break;
default:
printf("Inserisci un valore valido\n;");
break;
}
return count;
}
在此先感谢您的耐心等待和帮助,对不起我的英语:)
"sometimes it works sometimes it doesn't"。我没有测试,但这意味着 未定义的行为 。一个明显的未定义行为是:
char cerca;
然后这个:
scanf ("%s", &cerca);
这是扫描 cerca
作为字符 上的指针。但是甚至没有足够的空间容纳 1 个字符(加上 nul 终止符)。这是一个恶性错误,因为它甚至不会触发警告(&cerca
的类型是 char *
没问题)。
快速修复:
char cerca[100];
然后
scanf("%99s",cerca);
并在其余代码中将 &cerca
更改为 cerca
(strcmp
部分也是如此,请确保启用警告)。这是安全的,如果字符串太大会被截断。没有溢出,没有未定义的行为。
我正在将普通 scanf 输入的字符串与结构中的字符串进行比较。 这是结构:
typedef struct{ // Tipo giocatore e i suoi dati
int id;
char * nome;
char * cognome; //<--------- this one (it means surname)
int eta;
char * ruolo;
squadra team;
char * college;
int td;
} giocatore;
这是有效和无效的代码 (?.?)。我不知道为什么有时它有效而有时却无效,因为这是开关的第二种情况,它与第一种情况具有相同的代码,但使用单词 "name" 而不是 "surname".请记住,第一个案例每次都有效,第二个案例是选择(lol),最后一个案例(第三个)包含我之前解释过的第一个问题。
size_t ricerca(short int tipo, size_t sz, giocatore array[]){
size_t count = 0;
char cerca;
switch(tipo){
case 1:
printf ("Inserisci il nome da cercare: ");
scanf ("%s", &cerca);
for (size_t i = 0; i < sz; ++i){
if (strcmp(array[i].nome, &cerca) == 0){
printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
array[i].id,
array[i].nome,
array[i].cognome,
array[i].eta,
array[i].ruolo,
array[i].team.nome,
array[i].college);
count++;
}
}
break;
case 2:
printf ("Inserisci il cognome da cercare: ");
scanf ("%s", &cerca);
for (size_t i = 0; i < sz; ++i){
if (strcmp(array[i].cognome, &cerca) == 0){
printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
array[i].id,
array[i].nome,
array[i].cognome,
array[i].eta,
array[i].ruolo,
array[i].team.nome,
array[i].college);
count++;
}
}
break;
case 3:
goto Cleanup;
Cleanup: ;
char nomesq[30];
printf ("Inserisci il nome della squadra da cercare: ");
scanf("%[^\n]%*c", nomesq);
for (size_t i = 0; i < sz; ++i){
if (strcmp(array[i].team.nome, nomesq) == 0){
printf("ID:%d Nome:'%s' Cognome:'%s' Eta:%d Ruolo:'%s' Team:'%s' College:'%s'\n",
array[i].id,
array[i].nome,
array[i].cognome,
array[i].eta,
array[i].ruolo,
array[i].team.nome,
array[i].college);
count += 1;
}
}
break;
default:
printf("Inserisci un valore valido\n;");
break;
}
return count;
}
在此先感谢您的耐心等待和帮助,对不起我的英语:)
"sometimes it works sometimes it doesn't"。我没有测试,但这意味着 未定义的行为 。一个明显的未定义行为是:
char cerca;
然后这个:
scanf ("%s", &cerca);
这是扫描 cerca
作为字符 上的指针。但是甚至没有足够的空间容纳 1 个字符(加上 nul 终止符)。这是一个恶性错误,因为它甚至不会触发警告(&cerca
的类型是 char *
没问题)。
快速修复:
char cerca[100];
然后
scanf("%99s",cerca);
并在其余代码中将 &cerca
更改为 cerca
(strcmp
部分也是如此,请确保启用警告)。这是安全的,如果字符串太大会被截断。没有溢出,没有未定义的行为。