Portál AbcLinuxu, 10. května 2025 03:27
fscanf(fr, "%s %s %s %s %s", &retezec1, &retezec2, &retezec3, &retezec4, &retezec5);Můj problém je, že já potřebuju, aby z každého řetězce bylo načteno pouze 5 prvních znaků. Pokud jich je náhodou víc potřebuju, aby byly za pátým znakem useknuty. Definoval jsem si tedy proměné retezec jako pole 5 charů. Žil jsem v domění, že funkce fscanf automaticky řetězec usekne, ale neděje se tak. Pokud je náhodou řetězec delší program spadne. Je to jednoúčelový program a moc programování nerozumím, proto teď nevím moc jak dál. Dá se nějak funkce fscanf nastavit, aby z každého řetězce přečetla pouze prvních pět znaků do první proměné - poté přeskočila na další řetězec a načetla opět prvních 5 znaků do další proměné a tak dále? Předem děkuju za radu.
Řešení dotazu:
#include <stdio.h> #include <string.h> #define STR_MAX 32 #define STR_SIZE 5 #define TO_STR_SIZE "5" #define WORDS_IN_ROW 5 int main(int argc, char *argv[]) { FILE *f; f=fopen("file.txt", "r"); if (f != NULL) { char str[WORDS_IN_ROW][STR_SIZE+1]; int i; for (i=0;i<WORDS_IN_ROW;i++) { fscanf(f, "%" TO_STR_SIZE "s", &str[i]); str[i][STR_SIZE]='\0'; if (i<WORDS_IN_ROW-1) { char c; if ((c=fgetc(f)) != ' ') { char tmp[STR_MAX]; fscanf(f, "%s ", &tmp); } else { ungetc(c, f); } } } for (i=0;i<WORDS_IN_ROW;i++) { printf("%d: %s\n", i, str[i]); } fclose(f); } return 0; }
fscanf(fr,"%5c", &retezec);? NN
char retezec1[MAX_LEN], ..., retezec5[MAX_LEN]; fscanf(fr, "%s %s %s %s %s", retezec1, ..., retezec5); retezec1[5] = ... = retezec5[5] = '\0';C uz jsem dlouho neuzival, ale maji tam skutecne byt ty &?
if (strlen(s) > 5) s[5] = '\0';A nezapomenout pak uvolnit pomocí free().
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.