Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Problema c
#1
Posted 21 April 2014 - 15:40
Am de facut o biblioteca pentru implementarea unor alternative ale functiilor : strcat , strcpy , strlen si gets pentru citirea sirului de caractere . Functiile din biblioteca trebuie sa efectueze controale pentru a evita depasirea buffer-ului si pentru a se asigura că toate sirurile de caractere sunt null-terminate după fiecare operație.
Nu am nicio idee cum ar trebui sa arate acest program . Va rog, ajutati-ma Edited by Maryus222, 21 April 2014 - 15:45. |
#2
Posted 21 April 2014 - 15:45
Stii ce sunt
Quote strcat , strcpy , strlen si gets Stii ce parametri primesc, ce date returneaza? |
#3
Posted 21 April 2014 - 15:47
#4
Posted 21 April 2014 - 15:56
Eu am cateva coduri sursa ,dar nu stiu cum sa le leg si sa le pun intr-o biblioteca.
char * strcat(char * str1, const char * str2) { assert((str1!= NULL) && (str2!= NULL)); char * temp1 = str1; while (*temp1 ++ = '\0'); temp1 -- ; while ((*temp1 ++ = *str2 ++)!='/0'); return str1; } void strcpy(char *strDest, const char * strSrc) { assert((strSrc!= NULL) && (strDest!= NULL)); while (*strSrc != '/0') *strDest ++ = *strSrc ++; *strDest = '/0'; } // Standard library functions char *strcpy (char * strDest, const char * strSrc) { assert((strSrc!= NULL) && (strDest!= NULL)); char * address = strDest; while ((*address ++ = *strSrc ++)!= '/0'); return address; } int strlen(const char * str) { assert(str != NULL); int length = 0; while (*str ++!= '/ 0') length ++; return length; } Edited by Maryus222, 21 April 2014 - 16:24. |
#5
Posted 21 April 2014 - 16:07
#6
Posted 21 April 2014 - 22:35
Maryus222, on 21 aprilie 2014 - 15:40, said: Am de facut o biblioteca pentru implementarea unor alternative ale functiilor : strcat , strcpy , strlen si gets pentru citirea sirului de caractere . Functiile din biblioteca trebuie sa efectueze controale pentru a evita depasirea buffer-ului si pentru a se asigura că toate sirurile de caractere sunt null-terminate după fiecare operație. Functiile respective nu pot detecta buffer overflow-uri, iar gets in special este "never use it, and I mean it.". Arunca o privire pe versiunile "safe" ale acestor functii, inclusiv cum trateaza terminatorul de sir. |
#7
Posted 22 April 2014 - 09:17
TS030, on 21 aprilie 2014 - 22:35, said:
Cine ti-a dat tema asta? Exact care sunt cerintele? Functiile respective nu pot detecta buffer overflow-uri, iar gets in special este "never use it, and I mean it.". Arunca o privire pe versiunile "safe" ale acestor functii, inclusiv cum trateaza terminatorul de sir. A library for safe string manipulation. The library will implement alternatives for the most common string manipulation functions: strcat, strcpy , strlen and gets for reading strings.The library functions must perform sanity checks to avoid buffer overruns and to ensure that all strings are null-terminated after each operation. |
#8
Posted 22 April 2014 - 09:33
OK... cum spuneam, arunca o privire pe versiunile "safe" - strn*, fgets; cu alte cuvinte, va trebui sa primesti dimensiunea buffer-ului ca parametru pentru a preveni un buffer overflow.
Atentie, strncpy nu garanteaza ca rezultatul e terminat prin null - din cerintele problemei, in cazul tau va trebui sa fie. Incearca sa te gandesti la toate cazurile posibile. Edited by TS030, 22 April 2014 - 09:35. |
#9
Posted 22 April 2014 - 10:10
TS030, on 22 aprilie 2014 - 09:33, said:
OK... cum spuneam, arunca o privire pe versiunile "safe" - strn*, fgets; cu alte cuvinte, va trebui sa primesti dimensiunea buffer-ului ca parametru pentru a preveni un buffer overflow. Atentie, strncpy nu garanteaza ca rezultatul e terminat prin null - din cerintele problemei, in cazul tau va trebui sa fie. Incearca sa te gandesti la toate cazurile posibile. strnlen(3) - Linux manual page strcpy(3) - Linux manual page strcat(3) - Linux manual page gets(3) - Linux manual page |
#11
Posted 22 April 2014 - 10:33
#12
Posted 22 April 2014 - 10:48
Ce-i ala prototip al unei functii? Ca mie-mi sare imediat in ochi in link-urile pe care le-ai dat...
|
#13
Posted 22 April 2014 - 10:50
Maryus222, on 22 aprilie 2014 - 10:33, said:
eu trebuie sa costruiesc o parte din biblioteca string.h , nu sa apelez versiuni "safe" ale functiilor din acea biblioteca , gen strcpy_s Edited by neagu_laurentiu, 22 April 2014 - 10:51. |
#14
Posted 22 April 2014 - 11:04
TS030, on 22 aprilie 2014 - 10:48, said:
Ce-i ala prototip al unei functii? Ca mie-mi sare imediat in ochi in link-urile pe care le-ai dat... #include<stdio.h> //functia long int factorial (int n) { //prototipul functiei long int f=1; for (int i=1; i<=n;i++) f=f*i; return f; } void main() { int n; printf("Introduceti n= "); scanf("%d", &n); if(!n) printf("0!=1\n"); else printf("%ld",factorial(n)); getchar(); } p.s Sunt nou in domeniul acesta al programarii si imi cer scuze daca mai incurcnotiunile ...sau le inventez. |
#15
Posted 22 April 2014 - 11:14
Ceea ce numesti tu prototip este corpul/body-ul unei functii. Pune mana pe-o carte de incepatori si incearca s-o parcurgi, o sa-ti lamureasca multe lucruri si-o sa-ti simplifice viata.
http://en.wikipedia....ction_prototype Prototipul este: long int factorial (int n); Din exemplele date in primul post, sa luam de exemplu un strcpy. Intelegi ce face? |
|
#16
Posted 22 April 2014 - 11:22
TS030, on 22 aprilie 2014 - 11:14, said:
Ceea ce numesti tu prototip este corpul/body-ul unei functii. Pune mana pe-o carte de incepatori si incearca s-o parcurgi, o sa-ti lamureasca multe lucruri si-o sa-ti simplifice viata. http://en.wikipedia....ction_prototype Prototipul este: long int factorial (int n); Din exemplele date in primul post, sa luam de exemplu un strcpy. Intelegi ce face? Inteleg ce face fiecare functie , dar nu stiu cum sa le constuiesc "corpul" ....dupa cum spuneam ...sunt incepator...am parcurs deja o carte de programare si o multime de pagini web dar tot nu stiu cum sa rezolv aceasta problema . In plus , ea face parte dintr-un proiect in care ar mai trebui sa pun documentatie ,Latex, algoritm,etc si pe care va trebui sa il prezint peste o saptamana. Edited by Maryus222, 22 April 2014 - 11:29. |
#17
Posted 22 April 2014 - 12:32
Maryus222, on 22 aprilie 2014 - 11:22, said:
Inteleg ce face fiecare functie , dar nu stiu cum sa le constuiesc "corpul" ....dupa cum spuneam ...sunt incepator...am parcurs deja o carte de programare si o multime de pagini web dar tot nu stiu cum sa rezolv aceasta problema . "Corpul" il construiesti pur si simplu, intre acolade. Declararea functiilor/prototype-ul (acelasi lucru inseamna) e necesara atunci cand definirea acestora (adica corpul) se afla dupa functia main. Daca sunt definite inainte de main, nu e nevoie de prototype. exemplu: #include <stdio.h> //includere header io /* prototype inainte de main pt. a ajuta compilatorul sa inteleaga ce e cu dubleaza_ma din main, ce argumente are si ce returneaza proptotypeul contine tip returnare, nume functie, si tipuri paramentri (care trebuie sa fie aceeasi ca si in definitia functiei) si optional numele acelor variabile parametri (adica "numar" nu e obligatoriu, e suficient int, dar e buna practica sa fie si numele) */ int dubleazama(int numar); int main(){ int x = dubleazama(5); printf(x); return 0; } /* definitie functie dubleazama, ce primeste un intreg si returneaza valoarea sa dublata, tot intreg */ int dubleazama(int numar) { return numar + numar; } /* sfarsit program */ functia poate fi definita si exact acolo unde este prototype-ul, caz in care e si prototype si definitie, dar daca ai multe functii o sa arate urat codul inainte de main In mod normal, prototype-urile se definesc separat intr-un fisier header .h iar definitiile (implementarile) intr-un alt fisier .c sau .cpp dupa caz cu acelasi nume ca si headerul Inca o mica chestie, in C89/90/ISO C nu poti declara variabila in interiorul unui for cum ai tu for (int i = ...) ... se poate in C99 dar standardul asta e slab adoptat si in mod normal trebuie sa dai un flag compilerului (daca suporta) ca sa nu iti dea eroare... in C++ e ok. Edited by MrReason, 22 April 2014 - 12:37. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users