#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
char* trim ( char *s )
{
char *rez, zadnjiznak;
int i,brojac=0,j;
rez= ( char* ) malloc ( strlen ( s ) *sizeof ( char ) );
for ( i=0; * ( s+i ) = ' '; i++ )
{
brojac++;
}
for ( i=brojac, j=0; * ( s+i ) !='\0'; i++,j++ )
{
* ( rez+j ) = * ( s+i );
if ( * ( s+i ) =' ' )
{
if ( * ( s+i+1 ) = ' ' )
{
* ( rez+j+1 ) ='\0';
}
}
}
printf ( "%s",rez );
return rez;
}
int main ()
{
char *s, string[50];
int i;
printf ( "Unesi zeljenu recenicu:" );
scanf ( "%s", string );
trim ( string );
return 0;
}
recite mi šta molim vas šta mi ne radi u zadatku... Cilj zadatka je učitati string i onda izbrisati praznine ispred i iza stringa takav string ispisati a da početni ostaje netaknut
Pomoć pri zadatku iz c-a....
- poruka: 17
- |
- čitano: 3.972
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Evo moje rijesenje... nije najbolje, ali...
//trim f-cija iz src polja izbacuje vodece i slijedece praznine
//na nacin da src polje kopira u dest polje
//vraca broj iskopiranih znakova
int trim(char *src, char *dest)
{
int i=0;
//izbaci vodece praznine a to su ' ' space i '\t' tab na nacin
//da uvecavas src pokazivac (src++) dok src ne pokazuje
//na '\0' (to ti je ovaj *src - to mogu tako napisati
//zato sto je nenula true) i (to ti je && operator) src pokazuje na
//praznine - space ( *src==' ' ) ili tabulator ( *src=='\t' )
while(*src && (*src==' ' || *src=='\t'))
src++;
//zatim, kad sam nasao prvu neprazninu. znaci ne space i ne tab
//iskopiraj sve znakove iz src polja u dest polje ( dest[i++]=*(src++) )
//prilikom kopiranja uvecaji i++ za jedan i src++ pokazivac da pokazuje
//na slijedeci znak
//ne kopiraj '\0' null terminator-nema potrebe, gubitak vremena
//njega cemo postaviti u slijedecem koraku
while(*src)
dest[i++]=*(src++);
//oznaci kraj dest polja
//pronadji krajnju desnu neprazninu (dest[i]==' ' || dest[i]=='\t')
//ali pazi da ne izadjes iz granica dest polja s lijeve strane i>=0
//kako pretrazujem s desna na lijevo, indeks smanjujem za 1
//znaci i--
//ovaj prvi --i jer smo u predhodnom koraku imali dest[i++] pa nam je i pobjegao jedno mjesto desno - sada ga vratim
//for petlja zavrsava sa ; znaci, nista se ne izvrsava u for petlju, nemam sto!
for(--i; i>=0 && (dest[i]==' ' || dest[i]=='\t'); i--);
//kada sam nasao krajnju desnu neprazninu, onda na slijedece mjesto stavi
//'\0' null terminator - tj. nulu
//uoci, ne prepisujem sve byteove sa '\0' nema potrebe, samo bezvezna kopiranja po memoriji!!!
dest[++i]='\0';
//vrati koliko sam znakova iskopirao
return i;
}
pozdrav
Evo moje rješenje
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
char* trim ( char *s ){
int strLng = strlen(s);
int strStart=0;
int strEnd=0;
while( *(s + strStart) == ' ' )
strStart++;
while( *(s + strLng-strEnd -1 ) == ' ' )
strEnd++;
strLng = strLng - strStart - strEnd;
char* rez= ( char* ) malloc (strLng * sizeof ( char )+1);
int i=0;
for (i=0;i<strLng;i++) {
*(rez+i) = *(s + strStart + i);
}
*(rez+i)='\0';
printf ( "%s\n",rez );
return rez;
}
int _tmain(int argc, _TCHAR* argv[])
{
char stringx[50];
printf ( "Unesi zeljenu recenicu:\n" );
gets(stringx);
char *rez = trim (stringx );
free(rez);
system("PAUSE");
return 0;
}
E Harti fala al tvoje baš ne kužin neke stvari.
Programko fala puno sve san razumia i kontan dobra ideja nisan se sitia toga da iden unazad od maksimalne veličine stringa tako eliminirajuć iza praznine:D POZ
Evo, stavio komentare, nadam se da je jasnije!
Inace pozivanje malloc() unutar neke funkcije, a pozivanje free() negdje tko zna gdje nije bas najpametnije rijesenje. Zaboravit ces free, program ce se izvrsiti tko zna kojim redosljedom i preskocit ce free() poziv i imat ces memory leak, a to ti je za poluditi pronaci i izdebuggirati !!!
Napravis slijedece:
1. alociras memoriju za izlazno rijesenje (bilo malloc() bilo da si napisao char buff[50] )
2. pozoves f-ciju trim() i kao parametar joj proslijedis alociranu memoriju
3. radis sa trimom sto god hoces
4. u istoj f-ciji u kojoj si pozvao malloc(), par redova nize pozoves free()
pogledaj kako su izvedene ostale string f-cije u c-u, evo sto kaze npr. man strcpy
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
Manual jos kaze:
A simple implementation of strncpy() might be:
char*
strncpy(char *dest, const char *src, size_t n){
size_t i;
for (i = 0 ; i < n && src[i] != '\0' ; i++)
dest[i] = src[i];
for ( ; i < n ; i++)
dest[i] = '\0';
return dest;
}
UOCI: proslijedjuje se pokazivac na memoriju u koju se vrsi kopiranje i on se onda vraca sa return-om. Nista se ne alocira unutar same f-cije... to bi bila katastrofa, jer da strncpy nesto alocira, kako da ja kao krajni korisnik, koji ne poznam implementaciju, znam da moram pozvati free() na ono sto mi vrati???
Fala na pojašnjenju :D Pozdrav
e sta je to uopce za koj to prog ....Auto cad ili
e sta je to uopce za koj to prog ....Auto cad ili
e sta je to uopce za koj to prog ....Auto cad ili

e sta je to uopce za koj to prog ....Auto cad ili
ha ha ha ... da autocad ideš... nevjerojatno koje gluposti ode valjaju... ja mislia da ja ne znan niš o programiranju... btw... autocad je program... c je programski jezik... nisi puno fula. Samo ono...
Evo da ne otvaram novu temu:Vježbam zadatke za kontrolni i imam problem sa jednim koji glasi ovako: Učitati dva broja(x,y).U funkciji izračunati aritm.sredinu brojeva od broje x do broja y.
E sad,ne znam gdje mi je greška u kodu,ali stalno mi izbacuje da je arsr 2,a znam da sam taj zadatak točno riješio prije.Unaprijed hvala.
#include<stdio.h>
#include<iostream>
int f(int x,int y){
int z=0,n=0,i;
float w;
for(i=x;i<y;i++){z=z+i;
n++; }
w=(float)z/n;
return w;
}
main(){
int a,b;
float arsr;
printf("\n ucitajte dva broja");
scanf("%d %d",&a,&b);
arsr=f(a,b);
printf("\n arsr je %.2f",arsr);
system("PAUSE");
}
Meni normalno radi...
Znači sve je u redu?Možda je neki bug kod mene.
Valjda...
Usput, ja sam to kompajlao kao C++ kod u MinGWu (jedina razlika je što sam dodao main()u int kao povratni tip, jer C++ nema "defaultnog inta").
Evo da ne otvaram novu temu:Vježbam zadatke za kontrolni i imam problem sa jednim koji glasi ovako: Učitati dva broja(x,y).U funkciji izračunati aritm.sredinu brojeva od broje x do broja y.
(x+y)/2 ?
float f(int x, int y){
return (x + y) / 2.0;
}
Zašto ti funkcija ima povratnu vrijednost int kad unutar funkcije koristiš float i tražiš preciznost aritmetičke sredine ,ovako imaš gubitak točnosti određivanja aritm.sredine osim ako ti se u zadatku ne traži zaokružiti na cijele brojeve?Također u for petlji stavi i<=y po mom mišljenju.Možda i griješim.Drugi će ti pomoći.....