Intr-un program putin mai complex am urmatoarea secventa:
//.... a,b- 2 stringuri care contin doar cifre
//aux -string
strrev(a); strrev(b);
if(strlen(a)<strlen(b)||strcmp(a,b)<0)
{
strcpy(aux,a);
strcpy(a,b);
strcpy(b,aux);
}
puts(a); puts(b);
Dupa executarea acestei secvente imi afiseaza pe o linie nimic si pe alta numarul b.
De ce imi afiseaza in loc de a , nimic ??
ps: Am facut un debug si dupa ce se termina strcpy(b,aux) a devine null, de ce?
[later] Problema am rezolvat-o si fara secventa aceasta, dar totusi de ce se intrampla ca a sa devina NULL?
Am rezolvat
Numarul lui Stirling de speta a 2, folosind numere marii.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
void aduna(char *a,char *b,char *suma)
{strrev(a); strrev(b);
memset(suma,0,sizeof(suma));
int i,t=0,min=strlen(a)<strlen(b)?strlen(a):strlen(b);
for(i=0;i<min;++i)
{
suma[i]=((a[i]-'0')+(b[i]-'0')+t)%10+'0';
t=((a[i]-'0')+(b[i]-'0'))/10;
}
while(i<strlen(a))
{
suma[i]=((a[i]-'0')+t)%10+'0';
t=((a[i]-'0')+t)/10;
++i;
}
while(i<strlen(b))
{
suma[i]=((b[i]-'0')+t)%10+'0';
t=((b[i]-'0')+t)/10;
++i;
}
if(t) suma[i]=t+'0',++i;
strrev(a); strrev(b); strrev(suma);
}
void inmultire(char *a,char *b,char *produs)
{
strrev(a); strrev(b);
memset(produs,0,sizeof(produs));
int j,i,t;
char d[1000],d1[1000],p[1000];
for(i=0;i<strlen(b);++i)
{memset(d,0,sizeof(d));
memset(d1,'0',sizeof(d1));
for(t=j=0;j<strlen(a);++j)
{
d[j]=((a[j]-'0')*(b[i]-'0')+t)%10+'0';
t=((a[j]-'0')*(b[i]-'0'))/10;
}
if(t) d[j]=t+'0';
if(i==0) strcpy(produs,d);
else {strcpy(d1+i,d);
strrev(produs); strrev(d1);
aduna(produs,d1,p); strrev(p);
strcpy(produs,p);
}
}
strrev(a); strrev(b); strrev(produs);
}
char *s[201][201],numar[1000],suma[1000],produs[1000];
int main()
{
int n,k,i,j;
//freopen("decor.in","rt",stdin);
//freopen("decor.out","wt",stdout);
scanf("%d %d",&n,&k);
for(i=0;i<=n+1;++i)
for(j=0;j<=n+1;++j) s[i][j]=new char[201],memset(s[i][j],0,sizeof(s[i][j])); //mai exista si alta metoda de a aloca o matrice de
//200X200X200??
for(i=1;i<=n;++i) s[i][1][0]=s[i][i][0]='1';
for(i=3;i<=n;++i)
for(j=2;j<i;++j)
{
ltoa(j,numar,10);
inmultire(s[i-1][j],numar,produs);
aduna(produs,s[i-1][j-1],s[i][j]);
}
puts(s[n][k]);
system("PAUSE>NULL");
return 0;
}
Pentru numere mici merge, dar cand vine vorba de S(100,35) crapa, de ce??
[later] Am gasit de ce nu merge, nu se aloca memorie, dar cum o aloc ca sa mearga?? Am incercat malloc, calloc,new,farcalloc ...is disperat !!!