PITANE
4 отговора
203 прегледа
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 " П "
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 " П "
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.
Колкото до опитите ти да присвоиш един низ на друг низ - също няма да стане по начина, по който си ги описал. Ти си декларирал str1 и str2 като променливи от тип char, т.е. единични символи. Вместо това, трябва да ги декларираш като указатели:
char *str1 = "Blah blah 1";
char *str2 = "Blah blah 2";
Така вече ще можеш да направиш str1 = str2, и това ще бъде легално. Имай предвид обаче, че това не копира данните от втория низ в първия, а просто пренасочва указателя str1 да сочи натам, накъдето сочи и str2.
Re: PITANE
значи,
в първото примерче на указателя (който до момента е бил неинициализира), присвояваш адреса на въпросния стринг - нищо лошо, указателя е сочел към нищото, сега започва да сочи към нещо. във второто примерче обаче става страшно - указателя не сочи на никъде. ако компилатора е достатъчно умен, че да го инициалира с 0 - добре, иначе стойността му си остава случайна. и тогава... gets се опитва на този адрес да запише нещо. ако е 0, най-много да получиш access violation. но ако е случаен указател - яко омазваш паметта. затова най-добре го декларирай като char str[255] - така заедно със заделянето на паметта str ще получи и валиден адрес.
сега за присвояването. така, както си го написал, няма да го компилираш и посмъртно даже
. предполагам, че си имал предвид:
char str1[] = "one, str2[] = "two";
в този случай str1 и str2 са масиви, демек - константни указатели. като се опитваш да правиш присвоявания, на практика присвояваш адреси, а не стойности. опитваш се да пренасочиш единия указател към друго място в паметта. но след като са константи - не става. ако искаш единия стринг да съдържа копие на втория, използвай strcpy(str1, str2).
и като за начало - най-добре забрави Pascal
.
стой та гледай
в първото примерче на указателя (който до момента е бил неинициализира), присвояваш адреса на въпросния стринг - нищо лошо, указателя е сочел към нищото, сега започва да сочи към нещо. във второто примерче обаче става страшно - указателя не сочи на никъде. ако компилатора е достатъчно умен, че да го инициалира с 0 - добре, иначе стойността му си остава случайна. и тогава... gets се опитва на този адрес да запише нещо. ако е 0, най-много да получиш access violation. но ако е случаен указател - яко омазваш паметта. затова най-добре го декларирай като char str[255] - така заедно със заделянето на паметта str ще получи и валиден адрес.
сега за присвояването. така, както си го написал, няма да го компилираш и посмъртно даже
char str1[] = "one, str2[] = "two";
в този случай str1 и str2 са масиви, демек - константни указатели. като се опитваш да правиш присвоявания, на практика присвояваш адреси, а не стойности. опитваш се да пренасочиш единия указател към друго място в паметта. но след като са константи - не става. ако искаш единия стринг да съдържа копие на втория, използвай strcpy(str1, str2).
и като за начало - най-добре забрави Pascal
стой та гледай
Re: PITANE
Що не пишеш по нормален subject? То ясно че е питане, ама да знае човек за какво става въпрос... 
Reality is for people who can't face the Science Fiction!
Reality is for people who can't face the Science Fiction!
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 !
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 !