Есть исходник: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"; ?
>Есть исходник:
>
>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 ? Насколько я помню С не занимается обнулением обьявленных переменных ?
Проблема в том(скорее всего), что ты пишешь:
char[2] x = "To";,а "To\0" - занимает 3 символа ('T''o''\0')
так ты затираешь какие-то данные в памяти (хотя я и могу ошибаться)
попробуй написать char[3] x = "To";
>Попытался узнать, где-же находится '\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";
Проблема решилась заменой:
char To[2]="To";
на
char *To="To";
А на счет трьох символов, то если посмотреть To[0], то выдаст "Т".
Тоесть нумерация идет не с 1, а с нуля...
Всем спасибо за помощь в сей проблеме....
>Тоесть нумерация идет не с 1, а с нуля...
>Всем спасибо за помощь в сей проблеме....Newser все правильно сказал
char To[2] - это массив из двух байт. To[0] - это первый, To[1] - это второй, а вот To[2] - это невыделенный участок памяти.
А для строки из двух символов необходимо выделять три байта, так как завершающий 0 нужно тоже где-то хранить.
По этому, часто можно встретить такие участки кода:
char *newstr=(char*)malloc(strlen(str)+1);