Подтвердить что ты не робот

Мои массивы символов объединяются в C

По какой-то причине мой второй массив символов (var2) сливается с первым (var1). Вот мой код:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()     
{
  char var1[5] = "Hello";
  char var2[5] = "World";

  printf("This program can write:\t%s\t%s\n", var1, var2);
  getch();
  return 0;
}

после компиляции, я получил следующую распечатку:

Эта программа может написать: Hello WorldHello

Когда я изменил код на printf("This program can write:\t%s\n", var2);, я получил следующую распечатку:

Эта программа может писать: WorldHello

Итак, ясно, что var1 объединяется с var2.

Это какая-то ошибка компилятора. Если да, то как я могу это исправить? Я попытался переустановить MINGW, но все равно получаю те же результаты.

Спасибо большое

4b9b3361

Ответ 1

Строки на самом деле представляют собой одномерный массив символов , завершаемый нулевым символом '\ 0'. Таким образом, строка с нулевым символом содержит символы, которые содержат строку, за которой следует нуль.

Следующее объявление и инициализация создают строку, состоящую из слова "Hello". Чтобы удерживать нулевой символ в конце массива, размер массива символов, содержащий строку, больше, чем число символов в слове "Hello".

char var1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

Вы можете просто сделать:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()     
{

 char var1[] = "Hello";
 char var2[] = "World";

 printf("This program can write:\t%s\t%s\n", var1, var2);
 getchar();
 return 0;

}

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

Ответ 2

Вы забыли включить de \0, который сообщает конец строки, поэтому обновление размера массивов плюс один сделает трюк:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()     
{
  char var1[6] = "Hello";
  char var2[6] = "World";

  printf("This program can write:\t%s\t%s\n", var1, var2);
  getchar();
  return 0;
}

Отпечатки:

Эта программа может писать: Hello World

Ответ 3

При использовании %s в качестве спецификатора формата в printf, он считывает символ из памяти и останавливается при поиске символа '\0'. Если он не находит символ '\0', он читает, пока не найдет символ '\0' где-нибудь в памяти.

В приведенном выше фрагменте var1 и var2 представлены массивы символов длины 5. Поскольку вы используете %s в качестве спецификатора формата, вам необходимо завершить их с помощью '\0'. Это можно сделать, увеличив размер массивов. По умолчанию будет добавлен символ '\0'

char var1[6] = "Hello";
char var2[6] = "World";   

См. разницу между char var1[5] = "Hello"; и char var1[6] = "Hello";

+--------+--------+--------+--------+--------+
|        |        |        |        |        |  
|  'H'   |  'e'   |  'l'   |   'l'  |  'o'   |  char var1[5] = "Hello";
|        |        |        |        |        | 
+--------+--------+--------+--------+--------+





+--------+--------+--------+--------+--------+--------+
|        |        |        |        |        |        |
|  'H'   |  'e'   |  'l'   |   'l'  |  'o'   |   '\0' |  char var1[6] = "Hello";
|        |        |        |        |        |        |
+--------+--------+--------+--------+--------+--------+