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?

Attachment: pgpcQeynLI8mw.pgp
Description: PGP signature

Reply via email to