Re: Re: lug-bg: gcc str[i]=''; ?!.
- Subject: Re: Re: lug-bg: gcc str[i]=''; ?!.
- From: Peter Pentchev <roam@xxxxxxxxxxx>
- Date: Tue, 15 Jun 2004 16:05:07 +0300
On Tue, Jun 15, 2004 at 03:44:03PM +0300, dgt_it dgt_it wrote:
[format recovered, see
> >-------- Оригинално писмо --------
> >От: peyo <peyo@xxxxxxxxx>
> >Относно: Re: lug-bg: gcc str[i]=''; ?!.
> >До: lug-bg@xxxxxxxxxxxxxxxxxx
> >Изпратено на: Вторник, 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 roam@xxxxxxxxxxx roam@xxxxxxxx roam@xxxxxxxxxxx
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?
Attachment:
pgpn644P1FL3P.pgp
Description: PGP signature
|