- Luck Dragon: Asszociációs játék. :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Magga: PLEX: multimédia az egész lakásban
- Tomasz72: Ventilátor upgrade
- sziku69: Fűzzük össze a szavakat :)
- Elektromos rásegítésű kerékpárok
- Chosen: Canon 5D II - portrézás 2025-ben
- Szevam: „Rendszerleállás” – egy AI képzeletbeli halál utáni élménye
- bambano: Bambanő háza tája
- Geri Bátyó: B550 szűk keresztmetszet, de mi és miért?
Új hozzászólás Aktív témák
-
Csuty12
csendes tag
Sziasztok,
két hete kezdtem tanulni programozni c++ 3.1ben, az érdekelni hogy megoldható az hogy Vista-n normálisan fusson? A problémám az lenne hogy nem tudom teljes képernyőre kirakni, a másik pedig az hogy angol billentyűkiosztást használ a program bent, lehet valahogy ezt magyarrá varázsolni? Így kicsit macerás a () és egyebek..
u.i.: azért ezt a programot használom mert ahol oktatják ott is ez van és így egyszerűbb..
Köszönöm
-
gaben
aktív tag
Hello!
Azt hogy tudom megoldani,hogy egy sima vektroból mondjuk törlöm a 3. elemet ill. egy mátrixnak mondjuk a középső sorát ? -
cellpeti
nagyúr
Sziasztok!
A Dev C++ról lemondtam.
Feltettem a C-Free-t,ezzel megírom a progit,majd mikor F5-vel lefuttatom egy ilyen kicsi ablakba fut le. Egész idáig jó volt,már régebben is írtam benne progit,akkor ok volt. Esetleg aki ilyet használ,az segíthetne nekem.
-
cellpeti
nagyúr
A Dev C++ tud olyat,hogy nem ugrik el a program végén,mint a C-Free?
-
sghc_toma
senior tag
válasz
-=Lord Tom=- #1185 üzenetére
az elozo beolvasas utan ottmarad az stdin-en egy '\n', es ezt olvassa be a masodik scanf.. csinalhatod azt, hogy olvasas elott kiurited az stdin-t mondjuk igy:
char c; while ((c = getc(stdin)) != EOF && c != '\n');
ja, es az osszehasonlitasnal ne "-t hasznalj, hanem '-t.. a "+" igazabol ket karakter, a vegen van egy '\0'..
-
cellpeti
nagyúr
válasz
-=Lord Tom=- #1187 üzenetére
köcce
-
-=Lord Tom=-
senior tag
Segítsetek plz, miért ugorja át a műveletjel megadását/miért nem lesz a muvjelnek megfelelő értéke?
#include <stdio.h>
int main(){
int szam, szam2;
char muvjel;
// Adatok beolvasása
printf("Kerem az elso szamot: ");
scanf("%d", &szam);
printf("\n\nMuvelet: ");
scanf("%c", &muvjel);
printf("\n\nKerem a masodik szamot: ");
scanf("%d", &szam2);
//Tényleges műveletvégrehajtás
if (muvjel=="+"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam+szam2));
}
else if (muvjel=="-"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam-szam2));
}
else if (muvjel=="*"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam*szam2));
}
else if (muvjel=="/"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam/szam2));
}
system("pause");
} -
cellpeti
nagyúr
üdv! Írtam egy progit a Code:
locks-ba,de nem engedi futtatni(F8).
Ez miért lehet?A fájlnak .c kiterjesztést adtam.
Tudnátok segíteni? -
kampi_
csendes tag
Sziasztok!
Tudna valaki segíteni nekem a CreateProcessWithLogonW függvénnyel kapcsolatban?
A problémám az vele, hogy létre tudok hozni egy processt pl Total commandert, de:
- bennt a cégnél műkődik is, mert egy admin usert adok meg, és hozzáférek olyan dolgokhoz amikhez csak ezzel a userral tudok. Ezzel eddig semmi gáz. Ha megnézem Task Managerben, akkor ott viszont nem úgy látszik, hogy az admin userrel futtatom a process-t hanem a SYSTEM futtatja a process-t. Na mindegy, végülis műkődik, csak gondoltam megkérdem ezt is hátha valaki tudja hogy miért?
- otthon viszont(hazaviszem a laptopom) megpróbálom ugyanezt (semmit nem változtattam a kódon) és meg akarom nyitni az admin userrel ugyanúgy a Total commandert (már be voltam jelentkezve a gépre vele, így létrejöt a profil, tehát elvileg már akármit tudok run as-ként futtatni), és meg is nyílik, viszont itt már nincsenek meg a jogaim. Most nem hálózati jogokra gondolok, hanem pl az a user amivel be vagyok lépve, nem admin, tehát pl nem tudok egy fájlt létrehozni a c:\-ben. Az admin userrel viszont simán tudok. Van egy lokális admin user is, azzal is megpróbáltam. Megadtam a usert, jelszót, domainnak meg a gépnevet, és ugyanúgy nincs jogom hozzá. Mindkét esetben (otthon az admin és a lokál admin esetében is) task managerben úgy látszik hogy a processt az a user futtaja aki be van jelentkezve.Erre van valakinek valami ötlete?
Előre is köszi a segítséget!
Kampi
-
sghc_toma
senior tag
válasz
skoda12 #1176 üzenetére
nem szukseges beallitani, ha .c a kiterjesztes, automatikusan C-kent fordit..
amugy a project Properties|C/C++|Advanced|Compile As helyen lehet beallitani az egesz project-re (ezt felulirja a kiterjesztes).. adott file-ra is be lehet allitani, ekkor ertelemszeruen a file Properties lapjan kell beallitani, nem a project-en.. -
cellpeti
nagyúr
-
cellpeti
nagyúr
Nem akarok hülyeséget kérdezni,de mibe lehet C.be programozni, kompatibilisnek kell lennie a Turbo C 2.0-val???
Visual C vagy Visual Studio 2008 vagy melyik?
-
kampi_
csendes tag
Hi!
Boccs, hogy ennyit írok. Szóval mostmár sikerült megcsinálni. A LOGON_WITH_PROFILE-t kellett átírni LOGON_NETCREDENTIALS_ONLY-ra. Most viszont az a bajom, hogy a process elindul, de a másik user neve alatt, hanem vagy az enyém alatt, vagy pedig system-ként látja a taskmanager. Ez mitől lehet? Ebben segítsetek légyszíves, mert fontos lenne.
Köszönöm!
kampi
-
kampi_
csendes tag
Hi!
A GetLastError 1326-ot ad vissza, vagyis Logon Failure-el szállt el. Közben rájöttem, hogy az volt a gáz, hogy nem Unicoe típust hazsnáltam, hanem csak sima char-t nem wchar_t -t. De ezt már kijavítottam. Most az a bajom, hogy ha lokális felhasználóval akarok egy process-t nyitni, akkor műkődik, viszont ha egy olyan userral ami domain-tag akkor márnem megy. GetLastError szintén 1326-ot ad vissza.
Valakinek valami ötlet?
Előre is köszi!
kampi
-
Jester01
veterán
1) megnézted, hogy a GetLastError mit mond?
2) van joga a felhasználónak a desktophoz? ("The application must add permission for the specified user account to the specified window station and desktop, even for WinSta0\Default.")
3) esetleg nem unicode stringeket adsz be neki? -
kampi_
csendes tag
Hi!
Tudja valaki hogy hogyan kell használni a CreateProcessWithLogonW fv-t? Vagy csak én vagyok béna, és azért nem jó?
Így próbálom,de nem történik semmi, a CreateProcessWithLogonW mindig 0-t ad vissza,vagyis valamilyen hiba van,csak nem találom meg hogy mi?
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
int bFuncRetn = CreateProcessWithLogonW(
(LPCWSTR)user,
(LPCWSTR)domain,
(LPCWSTR)password,
LOGON_WITH_PROFILE,//LOGON_NETCREDENTIALS_ONLY,
(LPWSTR)applicationname,
NULL,
CREATE_UNICODE_ENVIRONMENT,//CREATE_NEW_PROCESS_GROUP,
NULL,
NULL,
(LPSTARTUPINFOW)&StartInfo,
&ProcInfo
);CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
printf("\n\nCreateProcessWithLogonW returns :: %d", bFuncRetn);Előre is köszönöm a segítséget!
kampi
-
kampi_
csendes tag
Sziasztok!
Tudja valaki, hogy hogyan lehet megoldani C-ben azt, hogy létrehozok egy process-t, de úgy mintha run as-szel futttatnám? Tehát bekérem a felhasználónevet, meg a jelszót, meg hogy milyen process process-t nyissak meg, és az eredmény az hogy megnyílik a program csak úgy mintha az adott felhasználó nevében nyitnám meg.
Thx, kampi
-
Jester01
veterán
válasz
skylaner #1165 üzenetére
A valgrindban van egy "massif" eszköz is, az nem jó?
#-----------
snapshot=64
#-----------
time=124348
mem_heap_B=8
mem_heap_extra_B=8
mem_stacks_B=1008
heap_tree=detailed
n1: 8 (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
n0: 8 in 1 place, below massif's threshold (01.00%) -
skylaner
senior tag
válasz
Jester01 #1164 üzenetére
Na pl:
typedef struct szam{
int a;
int b;
} SZAM;
void szum(int a,int b)
{
printf("%d\n",a+b);
}
int main()
{
SZAM* sz;
sz=(SZAM*)malloc(sizeof(SZAM));
sz->a=4;
sz->b=5;
szum(sz->a,sz->b);
free(sz);
sz=NULL;
return 0;
}sz: 4 byte
*sz: 8byte
2 int másolat: 8byteTehát ennek összesen akkor min 20byte memória kell a program egy adott pontján.
Valami ilyesmire gondoltam. -
Jester01
veterán
válasz
skylaner #1163 üzenetére
Hát a globális (illetve statikus) változók azok benne vannak a program fejlécében (objdump -h kimenetben data+bss). Lokális változók méreténél (ideértve a függvényargumentumokat is) nem tudom mit szeretnél tudni, esetleg a maximális verem méretet? Mivel ismereteim szerint linux alatt a verem nem csökken, ezért azt elvileg ki lehet nyomozni a futás végén. Például gdb-vel breakpoint az exit függvényre és a /proc/<pid>/maps fájlban a stack bejegyzésből.
-
skylaner
senior tag
válasz
Jester01 #1162 üzenetére
Kösz, eszembe se jutott ez az n-ig összehasonlító fgv.
Visszatérve egy korábbi kérdésemre: valgrind
Feltettem ubuntut,valgrind-et. Futtattam --leak-check=full --showreachable=yes paraméterekkel, sok okosságot kiírt, de hogy tudnám azt megnézni h összesen mennyi memóriát használt a progi, ne csak azt amit malloc-al foglaltam le? Mindent, lokális,globális,fgv argumentumok változói stb...
Vagy nincs ilyen lehetőség? -
Jester01
veterán
válasz
skylaner #1161 üzenetére
Igen, a lezáró nulla csak akkor megy át, ha 14 byteot küldesz. Jelen esetben amúgy nem is kell lezárni: if (len == 13 && strncmp(msg, "download_over", 13) == 0) ....
Ja és a recv visszaadhat hibakódot (-1) vagy éppenséggel BUFF_SIZE értéket is és ezekben az esetekben a msg[len]='\0'; felettéb szerencsétlen lenne (de gondolom a hibakezelést csak innen a postból hagytad ki).
-
skylaner
senior tag
Lenne egy egyszerű kliens-szerver progi,amiben a két fél tud egymással chatelni ill. a kliens fájlokat tölthet le a szerverről.
A kérdésem a recv()-el kapcsolatban lenne.
Ha elküldök egy üzenetet:send(client_sock,"download_over",13,0);
Akkor a fogadásnál szükség van erre?
#define BUFF_SIZE 1024
.......
char msg[BUFF_SIZE];
int len;
......
len=recv(sock,msg,BUFF_SIZE,0);
msg[len]='\0';
if(strcmp(msg,"download_over")==0) { ....}Tehát le kell zárni a stringet, vagy ez automatikusan megtörténik ?
/esetleg a send-nél 14-t kellene megadni, és akkor másolódik át automatikusan a lezáró '\0' ? / -
Gyuri16
senior tag
-
skylaner
senior tag
Megtudnátok mondani, hogy az alábbi kód, hogyan/miért működik pointerek nélkül?
#include <stdio.h>
#define csere(a, b) { int c; c=a; a=b; b=c; }
int main()
{
int a=4, b=9;
csere(a,b);
printf("%d %d",a,b); // 9 4
return 0;
} -
bodisjani
csendes tag
Sziasztok!
Most kezdek C-vel bajlódni és az első lépéseknél el is akadtam: A fordító Dev-C++, az oprendszer Vista, a probléma pedig az, hogy a prgram lefordítódik, le is fut, csak azonnal be is záródik az ablak. Az egészből csak egy villanást látok. ???
Előre is köszi!!
-
ReJim
őstag
sziasztok c-ben hogyan tudok udp-n adatot küldeni?
(server linuxon, kliens winen. gcc fordítók, winen devc++ és mingw)ez a kód jó lenne nekem, de winre nem találok headert:
/*********************** udpclient.c ***********************/\
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h> /* memset() */
#include <sys/time.h> /* select() */
#define REMOTE_SERVER_PORT 1500
#define MAX_MSG 100
int main(int argc, char *argv[]) {
int sd, rc, i;
struct sockaddr_in cliAddr, remoteServAddr;
struct hostent *h;
/* check command line args */
if(argc<3) {
printf("usage : %s <server> <data1> ... <dataN> \n", argv[0]);
exit(1);
}
/* get server IP address (no check if input is IP address or DNS name */
h = gethostbyname(argv[1]);
if(h==NULL) {
printf("%s: unknown host '%s' \n", argv[0], argv[1]);
exit(1);
}
printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name,
inet_ntoa(*(struct in_addr *)h->h_addr_list[0]));
remoteServAddr.sin_family = h->h_addrtype;
memcpy((char *) &remoteServAddr.sin_addr.s_addr,
h->h_addr_list[0], h->h_length);
remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT);
/* socket creation */
sd = socket(AF_INET,SOCK_DGRAM,0);
if(sd<0) {
printf("%s: cannot open socket \n",argv[0]);
exit(1);
}
/* bind any port */
cliAddr.sin_family = AF_INET;
cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
cliAddr.sin_port = htons(0);
rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr));
if(rc<0) {
printf("%s: cannot bind port\n", argv[0]);
exit(1);
}
/* send data */
for(i=2;i<argc;i++) {
rc = sendto(sd, argv[i], strlen(argv[i])+1, 0,
(struct sockaddr *) &remoteServAddr,
sizeof(remoteServAddr));
if(rc<0) {
printf("%s: cannot send data %d \n",argv[0],i-1);
close(sd);
exit(1);
}
}
return 1;
}valakinek valami ötlete?
-
Jester01
veterán
válasz
skylaner #1148 üzenetére
Viszont nincs benne hossz korlátozás ezért használata erősen ellenjavalt (buffer overrun). Helyette általában az fgets ajánlott, de vigyázat, az viszont eltárolja a sorvég jelet is. Jelen esetben azonban teljesen felesleges sorokat olvasni, mivel a feladat karakter-orientált.
-
skylaner
senior tag
válasz
cellpeti #1145 üzenetére
Én így csináltam, de szerintem egyáltalán nem bonyolult.
int main(){
char a[255], b[255];
int i=0,space=0,j=0,hossz;
printf("Bemenet:");
gets(a);
hossz=strlen(a);
for(i=0;i<hossz;i++) {
if(a[i]==' ') space++;
if(a[i]!=' '){
b[j]=a[i];
space=0;
j++;
}
if(space==1){
b[j]=a[i];
j++;
}
}
b[j]='\0';
printf("Kimenet:%s\n",b);
getch();
return 0;
}Aztán biztos van egyszerűbb megoldás is,de elsőre ez jutott eszembe.(Mondjuk Perl-be egy sor lenne az egész
)
-
skylaner
senior tag
-
cellpeti
nagyúr
Sziasztok!
Csillaggal már sikerült megírnom a programot,viszont szóközzel még nem igazán.
Arra gondoltam,hogy lehet az ASCII kódjával kéne próbálkozni. Tudja valaki a szóköz ASCII kódját? -
cellpeti
nagyúr
Sziasztok!
Nekem van egy feladatom,de nem teljesen értem.
Írjunk programot,ami a bemenetre adott szöveget úgy másoljuk át a kimenetre,hogy közben az egy vagy több szóközből álló karaktersorozatokat egyetlen szóközzel helyettesíti!Mi a feladat végülis?
-
skylaner
senior tag
Nekem is lenne egy kérdésem.
Kb. 1,5 éve nem foglalkoztam a C-vel, elvileg számgép-háló 2-n ebbe fogunk programozni, így
az a gondolatom támadt, hogy nem ártana átnézni a dolgokatNa szóval lenne nekem egy bináris keresőfás programocskám, ami működik is, annyi lenne a kérdésem, h az alábbi fgv valóban felszabadítja-e a lefoglalt memóriát. Jó ez így, vagy máshogy kellene csinálni ?
typedef struct fa{
int ID;
struct fa* left;
struct fa* right;
} Fa;
........
void felszabadit(Fa* myFa)
{
if(!myFa) return;
felszabadit(myFa->left);
felszabadit(myFa->right);
free(myFa);
}
int main() {
Fa* myFa=NULL;
.........................
felszabadit(myFa);
myFa=NULL;
return 0;
}Vagy esetleg magának a pointernek a címet kellene átadni, felszabadit(&myFa) és akkor void felszabadit(Fa** myFa) ......?
-
Jester01
veterán
válasz
Sk8erPeter #1133 üzenetére
1. azért mert unicode (akár utf8 akár utf16/ucs2) esetén nem 1 byte 1 karakter. Utf16 esetén továbbá sok 0 byte is előfordul ami C-ben sajnos a string végét jelzi.
2. nem fontos, de ha egyszer konstans, akkor miért ne
3-4. lásd a kollega válaszát fentebb
5. jó -
skylaner
senior tag
válasz
Sk8erPeter #1133 üzenetére
3-4
Mert a C automatikusan a string végére tesz egy '\0'-t, így tudja, h vége annak a stringnek.
Így n hosszú strignek n+1 nagyságú tömb kell.
Amikor pl te ezt írod,hogy: char a[]="abc" akkor a fordító automatikusan lefoglal +1 helyet még a \0-nak.char a[]="abc";
char b[]={'a','b','c','\0'};
printf("%d\n",sizeof(a)); // 4byte
printf("%d\n",sizeof(b)); // 4byte -
Sk8erPeter
nagyúr
válasz
Jester01 #1113 üzenetére
Bocsi, hogy csak most válaszolok, nem nagyon voltam gépközelben!
Köszönöm, hogy megírtad, ez nagyon faszán működik!
Pár rövid pluszkérdés:
1.) Ami érdekességet (számomra érdekes) felfedeztem, hogy ha sima Notepad-del, Unicode kódolással mentek egy fájlt, akkor nem működik a program, és egy 0 bájtos verziót készít el, míg az ANSI kódolásúakkal nincs probléma. Ez mitől van?
(Ha Notepad++-szal készítem el ugyanazt a fájlt, amiért a sima Notepad pampog, hogy elveszhetnek egyes karakterek, ha nem Unicode-ban mentem, akkor semmi para. Gondolom alapvetően a Notepad++ ANSI kódolással készíti el a fájlt, nem?)
2.) A "const int column" miért fontos, hogy const legyen?
3.) A "char infilename[MAX_FILENAME_LENGTH + 1];" sornál miért kell a +1?
4.) Ugyanígy ott van a plusz 1 a "char outfilename[MAX_FILENAME_LENGTH + 9]; /* a +8 a _jav.txt miatt */" sorban.
5.) A többin még gondolkozom...Még egyszer köszönöm, hogy megírtad!
-
cousin333
addikt
-
PazsitZ
addikt
-
cellpeti
nagyúr
Valaki tudna ebben segíteni?
-
cellpeti
nagyúr
válasz
Elektromann #1053 üzenetére
-
SLD
tag
válasz
cellpeti #1118 üzenetére
Ez nem gond, a \ jellel aktiválod, az őt követő karakter "különleges értelmezését", ami legtöbbször egy formázó karakter. Szóval az első \-el aktiváltad ezt, így a második \ megjelent (itt saját maga esetén persze nem aktiválod vele, hanem tulajdonképpen deaktiválod, de ez már csak részletkérdés), ha ebből Neked két darabot kell kiíratnod, akkor \\\\ -t (4x) kell írnod.
Szerk: No persze, ha a putchar, csak egy char-t tud kezelni akkor az lehet gond lesz, mert két \ már két karakter, várunk egy C -s kollegát
A kódhoz, C++-os lévén, inkább nem szólok hozzá, de ha már kiírt egy \-t akkor nagy baj nem lehet.
-
cellpeti
nagyúr
Sziasztok!
Van nekem egy olyan feladatom,hogy a bemeneti szöveget úgy kell átmásolni a kimenetre,hogy a közben előforduló tabulátorkaraktereket \t,a visszaléptetés \b és a fordított törtvonal(backslash) karaktereket \\ karakterekkel helyettesíti.
Na én elkezdtem ezt a progit,de \\ helyet csak \ rak,ez valszeg a putchar miatt van,valszeg nem ezt kell használni. Megpróbáltam printf-vel is,de ott se jutottam előrébb. Lehet az egész rossz,ahogy elkezdtem,ezért ha valaki tud adjon tanácsot,megkösszönném.
a kód:
#include<stdio.h>
void main(void) {
int c;
c = getchar();
while(c!=EOF)
{
if (c=='\t') putchar('\\');
if (c=='\b') putchar('\\');
if (c=='/') putchar('\\');
else putchar(c);
c=getchar();
}
}Esetleg egy darab if-ben nem lehetne megoldani a dolgot?
-
skoda12
aktív tag
Sosem foglalkoztam telefonokkal, de ha egy forráskódból futtatható binárist készítesz, akkor abból nem kapható vissza az eredeti forráskód. Az azonosítókat nem fordítják bele, így pl változóneveket, függvényneveket biztos nem lehet visszahozni. Ha van a telefonokra valami assembly szerű nyelv, akkor ilyen assembly utasításokra valószínűleg vissza lehet fejteni.
-
426os
őstag
Sziasztok.
Nem tudom ki hallott már a SE és Siemens telefonokon futtatható elfekről. Ezek apró kis programok, amelyek közvetlenül a hardverrel kommunikálnak, tehát elég gyorsan tudnak futni.
Viszont elég kevés elfnek nyilvános a forráskódja, és ennek hiányában nem igazán lehet belenyúlni, gondolok itt a lefordítást más nyelvre. Valamilyen szinten hex editorral ugye át lehet írni a karaktereket benne, de az nem az igazi. Ha jól tudom ezek C-ben vannak írva, tehát remélem jó helyen érdeklődök. Mégpedig afelől, hogy létezik-e olyan program, ami képes visszafejteni a kész, futtatható programot forráskódra. Mellékelek pár elfet (meg 1-2 forráskódot is, amihez nyilvános), csakhogy tudjátok miről beszélek.
[link]
Tudom, hogy az lenne a legegyszerűbb, hogy megkeresném a készítőket és elkérném a kódot, de ez sajnos nem járható út, mivel orosz barátaink nem szívesen adják azt ki.
Előre is köszönöm, ha valaki veszi a fáradtságot és foglalkozik velem.
üdv,
batonyo -
cellpeti
nagyúr
Hogyan tudom kiiratni EOF értékét?Mert ilyen progit kéne megírnom,de ....
-
Jester01
veterán
válasz
Sk8erPeter #1107 üzenetére
Na itt az én verzióm, hogy ti is kötözködhessetek. Amit még én magamba belekötök, hogy lehetne még:
1. függvényekre szétszedni
2. a hosszú fájlneveket is (láncolt listával) kezelni
3. a tab-okat kezelni
4. locale beállításokat figyelembe venni
5. a kimenő fájlnevet szebben előállítani
6. parancssori argumentumokat kezelni -
Jester01
veterán
válasz
Sk8erPeter #1107 üzenetére
Szerintem a fájlod esetleg unicode lehet, az bekavarhat.
-
Jester01
veterán
válasz
Benmartin #1109 üzenetére
5. Nem, de miért nem írod egyből jóra a programot? Azért, hogy extra pénzt kaszálj majd a professional verzióért ami nagyobb fájlokat is tud kezelni? Igen, lefordul, csak esetleg nem működik. Ráadásul a változó argumentumot használó függvényeknek ansi C szerint is kötelező a prototípus (pl. fscanf, printf) tehát általában az stdio.h bizony nem elhagyható. Az meg, hogy egy adott fordító esetleg mit eszik meg és mit nem, abszolút nem befolyásolja hogy mi van a szabványban vagy hogy mi a helyes.
6-7. melyik részének mondasz ellent? Annak, hogy int a prototípus nélküli függvények visszatérési értéke vagy annak, hogy pl. 64 biten piszkosul megszívod ha int-et használsz pointer helyett?
A többire pedig továbbra is csak azt tudom mondani, hogy lehetőleg ne ezt tanítsd egy kezdőnek.
-
Sk8erPeter
nagyúr
válasz
Benmartin #1109 üzenetére
"mert nem volt '\n' a sor végén." De itt pont különálló, sortöréssel elválasztott sorokról van szó... bár lehet, hogy félreértelek...
Milyen fordítóval próbáltad? Nálam most Visual Studio 2003 van fent (azért használom ezt egyelőre, mert egyetemen is ezt használják szoftver laboron, nem akarom, hogy a fordító különbözősége miatt ott jelentkezzen egy hiba, amire nem számítok)
Most még mindig csak azt nem tudom, hogyan is kéne akkor megoldani a feladatot, na majd próbálkozom...
Azért kérdeztem egyébként, hogy mivel olvastassam be az adatokat, mert lehetne fscanf(), fgets(), fgetc(), fread(), és még ki tudja, hány függvénnyel is elvégeztetni ezt a feladatot (fgetc nyilván nem jó, meg fscanf sem, asszem annak is van valami szóköz-problémája).
Valami olyasmire gondoltam egyébként, hogy a progi a beolvasáskor az első /n-ig elmegy, eltárol egy sort valamilyen tömbbe vagy akármibe, és ezt úgy adja ki, hogy az 5. karaktertől lesz kiírva. Végül is ha tömbként kezelem, akkor elvileg a 0. elemtől kezdi, akkor elég lenne csak hozzáadni +4-et, hogy kezdje onnan, nem? -
Benmartin
senior tag
válasz
Jester01 #1106 üzenetére
2. Igen, kipróbáltam, bizonyára azért működött, mert nem volt '\n' a sor végén.
3. Oké, elfogadom, én nem szoktam, lehet azért írtam így.
4. Ez oké, de nem akartam bele hibakezelést írni, meg overflowokra figyelni, mert az kétszer ennyi kód, jelzésnek viszont ott volt, hogy mire képes.
5. Szerencsére itt nem voltak olyan méretek.
6-7. Ennek ellent kell mondjak rengeteg forráskódot küldtem már programozó versenyekre, ahol oline judge fordít ANSI C fordítóval, és nem igényelte a headereket, tulajdonképpen még az stdio.h-t sem.
10. Ez kérdéses, hogy mikor jó, mikor nem. Ebben a kódban semmi jelentősége nem volt, hogy globálisak a változók, egy másik példában lehet zavart okoz, egy másikban meg lehet, hogy pont úgy célszerű.
11. Valóban nem tudhatom, ha ilyen egyéni igények vannak, akkor lehet változtatásokat eszközölni.
12. Nincs rendben, de mondtam, hogy ennek kivédését nem állt szándékomban megírni. -
Benmartin
senior tag
válasz
Sk8erPeter #1107 üzenetére
Mert különbözik a compilerünk, kipróbáltam mielőtt elküldtem neked.
-
Sk8erPeter
nagyúr
válasz
Benmartin #1102 üzenetére
Hali!
Köszi, hogy megírtad, de ez a program igen érdekes dolgokat csinál
A végeredmény az lesz, hogy MINDEN karakter után tesz egy szóközt. Egy fájlnál az összes sortörést is kitörölte (mondjuk nem értem, hogy ezt a másiknál miért nem tette).
Szemléltetésként ilyen lesz: [link] (itt épp php-kódokat másoltam ki pdf-ből, a sorszámozást ki akartam szedni, de ez a lényeg szempontjából tök mindegy)Első lefordításnál ilyen hibát dob:
(már a while(!feof(filelist))-nél baja van)
Gondolom ezért is működik hibásan többek közt...
Aztán már le sem akar fordulni (létrehozni az exe-t), na mindegy, itt valami nagyon nem jó...
De azért thx.Egy javított verzió jól jönne...
Előre is köszi!
Egyébként az "általános kérdéseket" hajnali fél 5 közeledtével fogalmaztam meg, így simán elképzelhető, hogy hülye kérdést tettem fel...
(#1103) doc: igazából mindkettő... de inkább gyakorolni szeretnék C-ben.
Nem használok Linuxot (egyelőre). Tehát elsősorban a C-s megoldás érdekelne.
Nyilván létezik egyébként olyan külső program (pl. Lupas Rename), amivel lazán megoldható, de abból nem lehet tanulni.(#1104) Jester01: Esetleg tudnál egy javított változatot mutatni?
-
Jester01
veterán
válasz
Benmartin #1105 üzenetére
Azért kötözködtem, mert tanuláshoz rossz példa.
2. Izé, kipróbáltad? Mert nem működik, mivel a feof csak azután lesz igaz, hogy túlmész a fájl végén. Tehát előfordulhat, hogy eggyel többször fut a ciklusod és az utolsó alkalommal ki tudja milyen adatra. Ehhez csak az kell, hogy az utolsó sor végén is legyen egy soremelés (márpedig ez normális dolog). Egyébként is pl. %d esetén vagy bonyolultabb formátumstringnél abból tudod, hogy sikerült-e beolvasni valamit. ellenkező esetben könnyen végtelen ciklus lehet (ugyanis olyankor a fscanf nem eszi meg a hibás adatot, de feof sem lesz)
3. sajnos de. sőt, még ékezeteket is. sokat szívok ezekkel én is a munkám során, főleg linux-windows közötti másolgatás nagy élmény (meg a kalapos vs. rendes ő/ű)
4. az azért van, hogy annyit kezel a programod, addig ok. de sehol nem biztosítod, hogy ne is legyen több. Az fscanf jelen formájában vidáman megesz többet is és szép buffer overflow lesz belőle. Ezt is jobb idejekorán megtanulni.
5. igen, és ez a rossz. már miért is ne lehetne egy 120GB-os fájlt feldolgozni csak azért mert nincs 120GB memóriám.
6-7. már hogyne kellene. Amelyik függvénynek nincs prototípusa, azt alapból int visszatérési értékkel feltételezi a fordító. Márpedig sem a malloc sem pedig az strcat nem int-tel tér vissza. És ha az int véletlen nem binárisan kompatibilis a void* illetve a char* típusokkal (pl 64 bites rendszer esetén) akkor az instant segfault.
10. szerintem nem fölösleges, jobb ha az újonc azt látja hogy a változókat a lehető legszűkebb körben deklaráljuk
11. azt te honnan tudod? És ha 5GB-os fájlra akarom futtatni? Vagy 128kB-osra 16 bites rendszeren?
12. ja és akkor nem kell. pl ha egy fájl (vagy sor) véletlen nincs 4 karakter akkor a program összeomlása az rendben van? -
Benmartin
senior tag
válasz
Jester01 #1104 üzenetére
1.) Tényleg elnéztem.
2.) Meglehet, gyakorlatban azonban működik.
3.) Jó, hát általában nem teszünk szóközt a fájlokba.
4.) Azért van a MAX_FAJLNEV_HOSSZ.
5.) Több megoldás is létezik.
6.-7.) ANSI C fordítónak nem is kell.
8.) Csúnyán néznek de működik, mondjuk akár ki is lehet venni.
9.) Ez jogos.
10.) Ebbe fölösleges belekötni.
11.) long-ot, de ebből nem igen lesz probléma.
12.) Nem is akartam hibakezelést írni. (gondolom magának írja) -
Jester01
veterán
válasz
Benmartin #1102 üzenetére
Ajjjaj ilyen rossz példával ne kábítsuk szegény tanulókat
Hirtelen ennyi:1. te nem a sorok elejéről szedted le az első 4 karaktert
2. az fscanf visszatérési értékét célszerű ellenőrizni, nem pedig a feof-ot
3. %s formátummal nem olvasunk fájlneveket (sem) mert megáll a szóközöknél
4. az fscanf-ben nincs hossz limit
5. teljesen felesleges betölteni a memóriába a fájlt
6. strcat-hoz hiányzik a megfelelő #include
7. malloc-hoz hiányzik a megfelelő #include
8. a malloc void*-ot ad vissza, csúnyán néznek azokra akik ezt cast-olják
9. a lefoglalt memóriát nem szabadítod fel
10. a változók globálisak nem lokálisak
11. az ftell nem unsigned int-et ad vissza
12. hibakezelés teljes hiánya -
doc
nagyúr
válasz
Sk8erPeter #1100 üzenetére
ezt kimondottan C-ben akarod megirni, vagy csak a megoldas a fontos?
Linux alatt ez igy nez ki:cat *txt | cut -c 5-
vagy ha kulon txt-kbe kell a vegeredmeny is:
for i in *txt; do cat $i | cut -c 5- >vagott-$i ; done
-
Benmartin
senior tag
válasz
Benmartin #1101 üzenetére
De megírtam, hogy ne csak dumáljak itt:
#include <stdio.h>
#define MAX_FAJLNEV_HOSSZ 100
FILE * filelist, * file;
char name[MAX_FAJLNEV_HOSSZ+1], * block;
unsigned int h;
int main()
{
filelist = fopen("filelist.txt","r");
while(!feof(filelist))
{
fscanf(filelist,"%s",name);
file = fopen(name,"r");
fseek (file,0,SEEK_END);
h = ftell(file);
rewind(file);
block = (char *) malloc(h);
fread(block,1,h,file);
block += 4;
fclose(file);
fopen(strcat(name,"_jav.txt"),"w");
fwrite(block,1,h-4,file);
fclose(file);
}
fclose(filelist);
return 0;
} -
Benmartin
senior tag
válasz
Sk8erPeter #1100 üzenetére
Elég általános kérdéseket teszel fel: "Hogyan születik meg a javított kimeneti fájl?" Hát úgy, hogy létrehozod a fájlt, erre mit lehet mondani?
1.) fgets
2.) Egyébként én úgy csinálnám, hogy magát a fájlneveket is kigyűjteném egy fájlba és abból olvasnám be, majd nyitnám meg a fájlokat.
3.) fopen("javitott.txt","w")
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Mars Gaming ML-LCD240 2x ARGB 120mm FDB Fan LCD Display (Alkatrésznek) INGYEN FOXPOST
- CORSAIR K55 RGB PRO XT (Kartámasz nélküli) INGYEN FOXPOST
- Szép! Dell Latitude 7430 ÜTÉSÁLLÓ! Üzleti Profi Ultrabook 14" -60% i5-1245U 16/512 FHD IRIS Xe
- Philips 32E1N1800LA/00 4K monitor
- LG UltraGear 27GS75Q-B (IPS/2K/180hz)
- BESZÁMÍTÁS! Asus TUF B450M R5 5600X 32GB DDR4 512GB SSD RTX 3060 XC 12GB Rampage SHIVA Chieftec 600W
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5800X 32/64GB RAM RTX 4060 Ti 8GB GAMER PC termékbeszámítással
- LG 65QNED87T / 65" - 164 cm QNED / 4K UHD / 120Hz & 3ms / HDR 10 Pro / FreeSync Premium / HDMI 2.1
- LG 27GR95UM - 27" MiniLED - UHD 4K - 160Hz 1ms - NVIDIA G-Sync - FreeSync Premium PRO - HDR 1000
- Samsung Galaxy A22 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged