The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Проблема с char массивами"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Проблема с char массивами"
Сообщение от Atos emailИскать по авторуВ закладки(??) on 09-Апр-04, 13:58  (MSK)
Есть исходник:

include <string.h>
...cut...
int main()
{
  char To[2]="To";
  char Tow[2]="To";
  char *Ukaz, *Ukaz2;
  
  Ukaz=To; Ukaz2=Tow;

//Цикл проверки значений Ukaz и Ukaz2

for(p=0;p<=i;p++)
{
        if(Ukaz[p]==Ukaz2[p])
        printf("%d\n",p);
        else
        {
        printf("ne ravno");
        break;
        }
}
return 0;
}

При выполнении доходит до 2-го знака(тоесть до '\0') И выкидывает через break. :-(
Попытался узнать, где-же находится '\0'. И ввел в исходник:

i=0;
while(Ukaz[i]) i++;
printf("%d\n",i); //Дабы узнать где находится '\0'

При выполнии i = 20.
Откуда такое значение, если иницилизация переменной char To[2]="To"; ?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Проблема с char массивами"
Сообщение от Simps emailИскать по авторуВ закладки(ok) on 09-Апр-04, 14:32  (MSK)
>Есть исходник:
>
>include <string.h>
>...cut...
>int main()
>{
>  char To[2]="To";
>  char Tow[2]="To";
>  char *Ukaz, *Ukaz2;
>
>  Ukaz=To; Ukaz2=Tow;
>
>//Цикл проверки значений Ukaz и Ukaz2
>
>for(p=0;p<=i;p++)
>{
>        if(Ukaz
>
>==Ukaz2
>
>)
>        printf("%d\n",p);
>        else
>        {
>        printf("ne ravno");
>        break;
>        }
>}
>return 0;
>}
>
>При выполнении доходит до 2-го знака(тоесть до '\0') И выкидывает через break.
>:-(
>Попытался узнать, где-же находится '\0'. И ввел в исходник:
>
>i=0;
>while(Ukaz[i]) i++;
>printf("%d\n",i); //Дабы узнать где находится '\0'
>
>При выполнии i = 20.
>Откуда такое значение, если иницилизация переменной char To[2]="To"; ?
А где ты присваиваешь значение i ? Насколько я помню С не занимается обнулением обьявленных переменных ?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Проблема с char массивами"
Сообщение от art_corp emailИскать по авторуВ закладки on 09-Апр-04, 16:12  (MSK)
Проблема в том(скорее всего), что ты пишешь:
char[2] x = "To";,а "To\0" - занимает 3 символа ('T''o''\0')
так ты затираешь какие-то данные в памяти (хотя я и могу ошибаться)  
попробуй написать char[3] x = "To";
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Проблема с char массивами"
Сообщение от newser Искать по авторуВ закладки on 09-Апр-04, 16:14  (MSK)
>Попытался узнать, где-же находится '\0'. И ввел в исходник:
>
>i=0;
>while(Ukaz[i]) i++;
>printf("%d\n",i); //Дабы узнать где находится '\0'
>
>При выполнии i = 20.
>Откуда такое значение, если иницилизация переменной char To[2]="To"; ?

Конструкция char To[2] сколько памяти резервирует? Правильно, две! А строка "To" сколько памяти занимает с учетом нулевого символа ('\0')? Три! Вот и получается, что i = 20! Пример более правильного объявления:
char To[3] = "To";
либо
char To[] = "To";
либо
char *To = "To";

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Проблема с char массивами"
Сообщение от Atos emailИскать по авторуВ закладки(??) on 09-Апр-04, 16:52  (MSK)
Проблема решилась заменой:
char To[2]="To";
на
char *To="To";
А на счет трьох символов, то если посмотреть To[0], то выдаст "Т".
Тоесть нумерация идет не с 1, а с нуля...
Всем спасибо за помощь в сей проблеме....
  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Проблема с char массивами"
Сообщение от mike emailИскать по авторуВ закладки(??) on 11-Апр-04, 12:19  (MSK)
>Тоесть нумерация идет не с 1, а с нуля...
>Всем спасибо за помощь в сей проблеме....

Newser все правильно сказал

char To[2] - это массив из двух байт. To[0] - это первый, To[1] - это второй, а вот To[2] - это невыделенный участок памяти.

А для строки из двух символов необходимо выделять три байта, так как завершающий 0 нужно тоже где-то хранить.

По этому, часто можно встретить такие участки кода:

char *newstr=(char*)malloc(strlen(str)+1);


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру