Ich möchte eine bestimmte Zeile analysieren. Also, ich habe das folgende Stück Code, um die Logik zu testen, aber ich wahrscheinlich verstehe etwas falsch:mangelndes Verständnis über sscanf Verwendung
typedef struct vers
{
char tu8UVersion[5];
char tu8UCommit[32];
}tst_prg_versions;
int main(int argc, char **argv)
{
tst_prg_versions lstVer;
char buf1[32];
char buf2[32];
char str[] = "BOARD-VERS-v1.0.0-git+9abc12345a";
sscanf(str, "BOARD-VERS-v%5s-git+%s", lstVer.tu8UVersion, lstVer.tu8UCommit);
printf("vers='%s'\n", lstVer.tu8UVersion);
printf("commit='%s'\n", lstVer.tu8UCommit);
sscanf(str, "BOARD-VERS-v%5s-git+%s", buf1, buf2);
printf("vers='%s'\n", buf1);
printf("commit='%s'\n", buf2);
return 0;
}
Einmal ausgeführt kehrt:
vers='1.0.09abc12345a'
commit='9abc12345a'
vers='1.0.0'
commit='9abc12345a
Warum der erste vers gleich zu 1.0.09abc12345a
ist und nicht 1.0.0
?
@ user3121023 Vielen Dank für Ihre Antwort! Um diese Art von Problem zu vermeiden, ist es besser, Strukturvariablen als char * zu deklarieren? sscanf ist verantwortlich für die Speicherzuweisung – ogs
'scanf' reserviert keinen Speicher für Sie; Sie müssen ausreichend große Puffer bereitstellen. –
'printf (" vers = '% s' \ n ", lstVer.tu8UVersion);' ist nicht nur fehlerhaft, es ist undefiniertes Verhalten. – sjsam