Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Montaj aer conditionat in balcon ...

joc idem Half Life gratis

PC game stream catre Nvidia Shiel...

Pompa de apa HEPU ?!
 Vreau o masina electrica de tocat...

Cum ajunge remorca de tir inapoi ...

Alt "Utilizator nou" pe T...

ULBS INFORMATICA
 Index preturi

Boxa membrana tweeter infundata

Am nevoie de poze cu un curcubeu

Whisky for Mac
 Xiaomi 14 Gpay

Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...
 

Problema c

- - - - -
  • Please log in to reply
16 replies to this topic

#1
Maryus222

Maryus222

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 21.04.2014
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 Posted Image

Edited by Maryus222, 21 April 2014 - 15:45.


#2
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,426
  • Înscris: 10.08.2005
Stii ce sunt

Quote

strcat , strcpy , strlen si gets
?
Stii ce parametri primesc, ce date returneaza?

#3
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003

 Maryus222, on 21 aprilie 2014 - 15:40, said:

Nu am nicio idee cum ar trebui sa arate  acest program .  Va rog, ajutati-ma Posted Image
Nu asa e ajutorul !

#4
Maryus222

Maryus222

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 21.04.2014
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
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
http://msdn.microsof...y/ms235627.aspx

http://forum.softped...ebui-sa-le-tie/

#6
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012

 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.
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.

#7
Maryus222

Maryus222

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 21.04.2014

 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.
Tema asta am primit-o la facultate...avand in vedere fapul ca in liceu nu am facut programare,acum imi este un pic mai greu.Am inceput sa invat c-ul dar nu am ajuns inca la nivelul acestei probleme.Cerintele originale sunau asa:
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
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
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
Maryus222

Maryus222

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 21.04.2014

 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.
M-am uitat peste versiunile "safe" ale acelor functii , dar nu le gasesc prototipurile.....eu cred ca intr-ul fel ar trebui sa inlocuiesc o parte din biblioteca string.h.

strnlen(3) - Linux manual page
strcpy(3) - Linux manual page
strcat(3) - Linux manual page
gets(3) - Linux manual page

#10
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003
http://msdn.microsof...y/8ef0s5kh.aspx

#11
Maryus222

Maryus222

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 21.04.2014

 neagu_laurentiu, on 22 aprilie 2014 - 10:23, said:

Multumesc pentru informatii , dar , cum spuneam mai sus , 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 Maryus222, 22 April 2014 - 10:34.


#12
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
Ce-i ala prototip al unei functii? Ca mie-mi sare imediat in ochi in link-urile pe care le-ai dat...

#13
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,600
  • Înscris: 30.07.2003

 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
Am inteles de la inceput. Ti-am dat link-ul sa vezi denumirea functiilor iar de aici trebuia imediat sa te uiti in codul lor (e liber) doar pentru inspiratie/intelegere.

Edited by neagu_laurentiu, 22 April 2014 - 10:51.


#14
Maryus222

Maryus222

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 21.04.2014

 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...
Prin prototip ma refeream la o functie:
#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
TS030

TS030

    Guru Member

  • Grup: Senior Members
  • Posts: 15,193
  • Înscris: 25.06.2012
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
Maryus222

Maryus222

    New Member

  • Grup: Members
  • Posts: 7
  • Înscris: 21.04.2014

 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
MrReason

MrReason

    Senior Member

  • Grup: Senior Members
  • Posts: 9,266
  • Înscris: 08.10.2010

 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 .
Foarte nasol. Ce carte? Ca orice carte macar pe un sfert decenta trateaza functiile intr-un capitol separat si iti ofera suficiente detalii. Cauta o carte de incepatori in engleza, sunt o multime. Dar nu stiu de ce banui ca nu stii suficienta engleza.

"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

Second Opinion 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate