Инициализатор струны до не включает разделитель?

//Use the functions of the client, the params of the function are in 
//the associative array
$params = array('customerid' => '1532');
$response = $soapclient->ca_customer_products($params);
echo '';
foreach($response->list->element as $product) {
  if($product->stock > 0) {
  echo '';
  echo '';
  print_r($product->description);
  echo "

".$product->price1."

"; echo "

".$product->price2."

"; print_r($product->price1); print_r($product->price2); print_r($product->stock); echo ''; } } echo '
ProductNaam PrijsQte
'; //echo ''; echo ''; //echo ''; //echo '
';

Вы неправильно закрываете свои теги. Также ознакомьтесь с документами , как упомянул @christopher_bincom.

5
задан too much php 23 January 2009 в 02:45
поделиться

7 ответов

Ваша строка [2] [9]. Они [9] ['1', '2', и т.д. '8', '9']. Поскольку Вы только дали ему комнату для 9 символов в первом измерении массива, и потому что Вы использовали все 9, это не имеет никакой комнаты для размещения '\0' символов. переопределите свой массив символов:

char string[2][10] = {"123456789", "123456789"};

И это должно работать.

24
ответ дан 18 December 2019 в 05:27
поделиться

Уверенный это делает, Вы просто не оставляете достаточно комнаты для '\0' байтов. Создание его:

char string[2][10] = { "123456789", "123456789" };

Будет работать, как Вы ожидаете (просто распечатает 9 символов).

5
ответ дан 18 December 2019 в 05:27
поделиться

Если Вы говорите C, что массив является данным размером, C не может сделать массив немного больше. Это не повиновалось бы Вам, если бы это сделало так! Помните, что не каждый массив символов содержит завершенную строку пустого указателя. Иногда массив (как используется) является действительно массивом (отдельного) символа. Компилятор не знает то, что Вы делаете и не можете прочитать свои мысли.

Поэтому C позволяет Вам инициализировать массив символов, где пустой разделитель не будет соответствовать, но все остальное будет. Попробуйте свой пример строкой на один байт дольше, и компилятор будет жаловаться.

Обратите внимание, что Ваш пример скомпилирует, но не сделает то, что Вы ожидаете, поскольку содержание не является (завершенный пустой указатель) строками. С GCC, выполняя Ваш пример, я вижу строку, я должен, сопровождаемый мусором.

3
ответ дан 18 December 2019 в 05:27
поделиться

Alterenatively, можно использовать:

char* myString[2] = {"123456789", "123456789" };

Как это, инициализатор вычисляет правильный размер для завершенных строк Вашего пустого указателя.

2
ответ дан 18 December 2019 в 05:27
поделиться

Существует ли причина, почему компилятор не предупреждает, что нет достаточного количества комнаты для 0 байтов? Я получаю предупреждение, если я пытаюсь добавить другой '9', который не будет соответствовать, но это, кажется, не заботится об отбрасывании 0 байтов?

0
ответ дан 18 December 2019 в 05:27
поделиться

C позволяет незавершенные строки, C++ не делает.

C позволяет символьным массивам быть инициализированными со строковыми константами. Это также позволяет инициализатору строковой константы содержать точно еще один символ, чем массив, который это инициализирует, т.е. неявный нулевой символ завершения строки может быть проигнорирован. Например:

char  name1[] =  "Harry";   // Array of 6 char

char  name2[6] = "Harry";   // Array of 6 char

char  name3[] =  { 'H', 'a', 'r', 'r', 'y', '\0' };
                            // Same as 'name1' initialization

char  name4[5] = "Harry";   // Array of 5 char, no null char 

C++ также позволяет символьным массивам быть инициализированными со строковыми константами, но всегда включает завершающийся нулевой символ в инициализацию. Таким образом последний инициализатор (name4) в примере выше недопустим в C++.

2
ответ дан 18 December 2019 в 05:27
поделиться

'\0' байтов не, это - проблема. Большую часть времени, если у Вас есть это:

char code[9] = "123456789";

Следующий байт будет от края переменной, но будет неиспользованной памятью и скорее всего будет 0 (если Вы malloc() и не устанавливайте значения перед использованием их). Таким образом, большую часть времени это работает, даже если это плохо для Вас.

При использовании gcc Вы могли бы также хотеть использовать - Стенной флаг или один из другого (миллион) предупреждения флагов. Это могло бы помочь (не уверенный).

0
ответ дан 18 December 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: