Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

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



 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.