Начало Вход/Регистрация Помощ Tazi stranica s latinski bukwi
Области
 Новини
 Актуална тема
 Linux портали
 Какво е Линукс?
 Въпроси-отговори
 Форуми
   •Трудова борса
   •Конкурс
 Статии
 Дистрибуции
   •Поръчка на CD
 Made In BG
 Файлове
 Връзки
 Галерия
 Конференции
Настройки
 Външен вид
 Предложения
 Направи си сам
И още ...
 За нас
 Линукс за българи ЕООД
 Линк към нас
 Предложения

Подкрепяно от:
TelePoint - Място за хора със свободни идеи

SiteGround

initLab

Adsys Group

SAP Bulgaria

Въпроси отговори
Въпрос: C programirane
[Търси: ]

ВНИМАНИЕ: Използвайте форумите на сайта за дa зададете вашите въпроси.

Към началото |Добави въпрос |Отговори
 
Въпрос
От: :) Дата: 04/07/2003
 abe ot skoro se zanimavam s C ta ima i mnogo neiasnotii i
neshta, koito si mislia che sym razbral no iavno ne e taka
Vyprosyt mi e za strigovete i tiahnoto inicializirane:

string[]="Hello"; i string[6]="Hello" sa mi iasni 
 no kogato probvam char *string; i posle niakyde v programata
 se opitam da mu zadam stoinost sys scanf("%s",string); mi
 dava greshki ...(Segmentation fault), neznam dali tova e
normalno.
 V tozi sluchai razglejdam *string kato pointer kym pyrviat
 symvol ot texta, koito shte byde zadaden s pomoshtta na
 scanf.(nali stringovete sa razglejdani kato masivi ot tip
char).
 Ta ako niakoi naistina e siguren v mnenieto si po vyprosa
 neka da kaje ... btw kompiliram s gcc 2.95 ili neshto takova
na Slackware8.1 s kernel 2.4.18

 PS. nikyde do sega ne sym sreshtal v knigi za zadavane ot
 vida *string i posle scanf .... no neznam ot kyde sym
 siguren che e taka ... za tova ako ne e taka kakto si misla
PLS da me razobedite :)



Отговор #1
От: Михаил Петров (misho1960 __@__ yahoo __точка__ com) Дата: 04/07/2003
 Когато имаш указател към променлива от тип char, нещата   
трябва да се направят така:   
char *string = new char[7];   
sprintf(string, "%s\0", "Hello");   
   
при това положение няма да ти даде segmentation  fault, а  
се задава големината му с един символ повече заради  
затварящата нула. А това което се опитваш ти да направиш е 
че в променливата стринг има място за два символа, колкото 
е и дължината на указателя, и не забравяй след като 
свършиш работата си с променливата да я освободиш с delete 
string; 
  
Опитай и успех !  
  
Михаил Петров


Отговор #2
От: Sudo Дата: 04/08/2003
Няколко важни уточнения:
1. sprintf функциите ВИНАГИ слагат "\0" в изходния стринг.
2. За такова нещо като char *string = new char[7];
 се използва malloc (calloc) не е нужно с топ муха да гърмим
:)
 3. Ако говорим за Линукс/x86 дължината на указателя е 4
байта в ДОС 2 байта и т.н.

Айде със здраве :)



Отговор #3
От: KeuH Дата: 04/08/2003
Само искам да поясня нещо.  Препоръчваният синтаксис 
 
char* string = new char[7] 
 
не е C синтаксис!  Това е C++ синтаксис и по принцип, ако 
трябва да се придържаме към C++ традицията, след това 
 вместо printf/scanf и т.н. трябва да се използва cout/cin. 
Но 
сега да отговоря на първоначалния въпрос.  Това е често 
срещанa грешка при начинаещите, когато работят със 
стрингове.  Проблемът е, че командата 
 
char *string; 
 
наистина създава указател към стринг, което ще рече 
инициализира се променлива, която съдържа адрес в 
паметта от сорта на 432864 (съвсем произволно го казвам, 
адресите в паметта излгеждат малко по-различно и се 
задават в шестнадестичен вид, но в случая това няма 
значение), просто си представяй, че към клетка номер 
432864 сочи string.  Адреса можеш да получиш с 
 
printf("%f", string); 
 
Това може и да е 000000!  Абсолютно произволно е.  И 
най-важното, на това място в паметта може и да има, 
може и да няма важни данни, които могат да използват и 
върху които може да се записва.  Сега, каква е цаката: 
трябва да присвоиш на променливата string стойност, която 
отговаря на някой адрес в паметта, за който е специално 
указано, че трябва да бъде резервиран за твоята цел.  И 
по-точно, ако трябва низът да е по-дълъг, то и 
"последващите го" адреси ще бъдат резервирани.  Това се 
прави, както беше споменато вече в C++ с оператора new, 
 а в C се прави с фунцията malloc от библиотеката <stdlib.h>.
 
С код: 
 
#include <stdlib.h> 
 
int main() { 
 
char* my_string = malloc (255 * sizeof(char)); 
strcpy(my_string, "blabla"); 
printf(my_string); 
free(my_string); 
return 0; 
} 
 
 Забележи, че my_string = "blabla" би било грешно, т.к. това

би присвоило на самия указател стойност blabla, а 
*my_string = "blabla" би дало предупреждения при 
компилация и може да има непредвидени резултати, т.к. 
по-същество е глупост (?). 
 
Има само една книга за C, и Kernighan и Ritchie са нейните 
 пророци: "The C Programming Language". И забележи някои
 неща.  Една програма на C често работи, въпреки че не е
 коректно написана, тъй като компилаторът налага много малко
 отграчния и тогава се хващаш за главата, когато след два-три
 часа идва segfault. В тоя случай може да помогне purify
 (цена от рода на $ 5000) и demalloc (вж. google) или както
 казва Линукс Торвалдс, намираш с gdb къде дропи и после
гледаш много внимателно и мислиш...
 
Поздрави, 
КейН 


<< download manager za X (3 ) | X WIndows System on FreeBSD (2 ) >>

 
© 2011-... Асоциация "Линукс за българи"
© 2007-2010 Линукс за българи ЕООД
© 1999-2006 Slavej Karadjov
Ако искате да препечатате или цитирате информация от този сайт прочетете първо това
Външния вид е направен от MOMCHE
Code Version: 1.0.8 H (Revision: 23-09-2011)
 
Изпълнението отне: 0 wallclock secs ( 0.06 usr + 0.01 sys = 0.07 CPU)