PITANE

4 отговора 203 прегледа
#1

PITANE

Zdraveite vsi4ki ,tiq dni razcykvam malko C ,nov sym ohte .

iskam da vi pitam nehto za edni programki te sa elementarni ama az nehto ne shvahtam ..

//raboti
#include <stdio.h>
int main(void) {
cahr *p; p="proba";printf(p); return 0; }

//neraboti
#inlcude <stdio.h>
int main(void) {
char *p; printf("Enter string"); gets(p); printf(p); return 0; }



zahto vtorata ne raboti kato po princip e edno i syhto ????????? -tova mi e vyprosa

iskam da vi pitam i ohte nehto zahto ne stava da prisvoqva slednoto:

char str1="one",str2="two";

str1=str2;//iskam da prisvoq na pyrviq string vtoriq ,znam 4e na4aloto na ukazatelq e konstanta n ne stava li taka i zahto ???

hte se radvam ako nqkoi me svetne ; )

mai naistina vsi4ko se vyrti okolo " П "
Отговор
в отговор на dm #2

Re: PITANE

Втората не работи, защото не си заделил памет за низа. P в този случай не сочи някъде си в паметта, и gets, опитвайки се да запише там низа, намазва нещо, и програмата най-вероятно краш-ва (а ако не - все намазва нещо). Трябва първо да заделиш памет (p = new char[100], или пък още с декларациата на p: char p[100]).

Колкото до опитите ти да присвоиш един низ на друг низ - също няма да стане по начина, по който си ги описал. Ти си декларирал str1 и str2 като променливи от тип char, т.е. единични символи. Вместо това, трябва да ги декларираш като указатели:

char *str1 = "Blah blah 1";
char *str2 = "Blah blah 2";

Така вече ще можеш да направиш str1 = str2, и това ще бъде легално. Имай предвид обаче, че това не копира данните от втория низ в първия, а просто пренасочва указателя str1 да сочи натам, накъдето сочи и str2.

Отговор
в отговор на dm #3

Re: PITANE

значи,
в първото примерче на указателя (който до момента е бил неинициализира), присвояваш адреса на въпросния стринг - нищо лошо, указателя е сочел към нищото, сега започва да сочи към нещо. във второто примерче обаче става страшно - указателя не сочи на никъде. ако компилатора е достатъчно умен, че да го инициалира с 0 - добре, иначе стойността му си остава случайна. и тогава... gets се опитва на този адрес да запише нещо. ако е 0, най-много да получиш access violation. но ако е случаен указател - яко омазваш паметта. затова най-добре го декларирай като char str[255] - така заедно със заделянето на паметта str ще получи и валиден адрес.

сега за присвояването. така, както си го написал, няма да го компилираш и посмъртно даже . предполагам, че си имал предвид:
char str1[] = "one, str2[] = "two";
в този случай str1 и str2 са масиви, демек - константни указатели. като се опитваш да правиш присвоявания, на практика присвояваш адреси, а не стойности. опитваш се да пренасочиш единия указател към друго място в паметта. но след като са константи - не става. ако искаш единия стринг да съдържа копие на втория, използвай strcpy(str1, str2).

и като за начало - най-добре забрави Pascal .

стой та гледай
Отговор
в отговор на dm #4

Re: PITANE

Що не пишеш по нормален subject? То ясно че е питане, ама да знае човек за какво става въпрос...

Reality is for people who can't face the Science Fiction!
Отговор
в отговор на lndependent #5

Re: PITANE

Blagodarq na vsi4ki za pomohta !

lndependent ,radvam se 4e daje i s grehki si razbral kakvo pitam, tova za konstantnite ukazateli naistina ne mi e mnogo qsno qvno hte trqqbva da porazrovq iz po-debelite knigi .. : )

edna patka mislila ,mislila i umrqla !
Отговор