On Tue, Jun 15, 2004 at 03:44:03PM +0300, dgt_it dgt_it wrote:
[format recovered, see
> >-------- Оригинално писмо --------
> >От: peyo <[EMAIL PROTECTED]>
> >Относно: Re: lug-bg: gcc str[i]=''; ?!.
> >До: [EMAIL PROTECTED]
> >Изпратено на: Вторник, 2004, Юни 15 15:32:26 EEST
> >----------------------------------
> >
> >Здрасти. Без да се впускам в подробности...
> >
> >#include <stdio.h>
> >#include <string.h>
> >#include <stdlib.h>
> >
> >int main(void)
> >{
> >
> > char str[255];
> > int num;
> >
> > gets(str);
> > str[4]='\000';
> > num=atoi(str);
> > printf("%d\n", num);
> > return 0;
> >
> >}
> > В случея 123456 , това връща 1234 - а я се опитай да изкраш по тоя > начин 3456 или даже 1256,просто няма да стане , защото \0 i > нулира/затваря/край на низа и дотук ;) нестава :( Това, което аз не мога да разбера (а май и другите :), е как по дяволите е възможно това изобщо да е работело :) Каквото и да запишеш на тази позиция в масива, процесорът ще замени това, което е стояло в тази клетка от паметта (ако не работиш с wide chars и multibyte strings, но тогава начините да ги променяш са малко по-сложни от s[1] = ...), с това, което му кажеш. Това е всичко, което ще направи - НЯМА да се опита по никакъв начин да "изтрие" тази част от низа, няма да се опита да мести остатъка от низа с един байт "напред", няма нищо такова - просто ще замени една стойност с друга и низът ще си остане с точно толкова символа, колкото са били и преди. Аз лично виждам два варианта изобщо да е възможно това, което казваш, че се е случвало преди.. не, всъщност вариантите са три :) 1. Между апострофите да е имало един символ, но той да е бил непечатим - т.е. такъв, че на обикновените терминали в обикнотените кодови таблици няма нищо, и при опит да бъде изведен на екрана просто терминалният емулатор не извежда нищо, но и не мести курсора на следваща позиция. Това може да е някой символ с код под 31 (но внимателно подбран ;), или примерно 127 или нещо такова. 2. Това да не е било C, а примерно нещо като Objective C или C++, и променливата s да е била декларирана не като прост масив в смисъла на езика C, а като обект от някакъв тип, който третира по особен начин присвояване на "празна" стойност... а, да, и трябва и компилаторът да разбира какво искаш да му кажеш с '', защото наистина кажи-речи никой стандартен C/C++ компилатор няма да приеме '' за валиден синтактичен елемент. Това пък ни води директно към следващия вариант: 3. Да не си използвал стандартно GNU C/C++, а нещо съвсем друго или поне "леко пачнато", така че да разбира от '' и да разбира, че като кажеш s[1] = '', всъщност имаш предвид strcpy(s + 1, s + 2); Само ти можеш да ни кажеш с кой от трите варианта си имаме работа :) Поздрави, Петър -- Peter Pentchev [EMAIL PROTECTED] [EMAIL PROTECTED] [EMAIL PROTECTED] PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553 If I were you, who would be reading this sentence?
pgpcQeynLI8mw.pgp
Description: PGP signature
