Я не знаю, что происходит. Он показывает мне, что abc такой, как я и ожидал, но когда я пытаюсь назначить некоторые значения abc для передачи, он показывает мнеenter code here
неожиданную цифру «4» на выходе.
#include <stdio.h>
int main(void)
{
char abc[52];
for (int i = 0; i < 52; i++)
{
if (i < 26)
{
abc[i] = 'a' + i;
}
else
{
abc[i] = 'A' + i - 26;
}
}
printf("%s\n", abc);
char pass[2];
pass[0] = abc[3];
printf("%s\n", pass);
pass[1] = abc[1];
printf("%s\n", pass);
}
Я получаю:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
д
дб4
Вместо:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
д
дБ
Строки, представленные в виде массивов символов, должны заканчиваться нулем. Это включает в себя ваши массивы abc
и pass
. printf
ничего не знает о размере вашего массива, когда ему передается abc
. Он просто печатает символы, начиная с этого адреса, пока не встретит символ \0
. То же самое для pass
Если abc
печатается правильно без добавленного к нему нулевого символа, возможно, вам просто повезло. Это технически неопределенное поведение.
Давайте исправим ваш код....
int main(void)
{
char abc[52+1]; // 53
for (int i = 0; i < 52; i++)
{
if (i < 26)
{
abc[i] = 'a' + i;
}
else
{
abc[i] = 'A' + i - 26;
}
}
abc[52] = '\0';
printf("%s\n", abc);
char pass[2+1]; //3
pass[0] = abc[3];
pass[1] = '\0'; // null terminate pass before printing
printf("%s\n", pass);
pass[1] = abc[1];
pass[2] = '\0'; // null terminate pass again before printing
printf("%s\n", pass);
}
Похоже на ошибку новичка, сработало. Спасибо :)
@selbie Думаю, добавление abc[52+1]
на самом деле не нужно. Вы зацикливаете, начиная с 0
до меньше чем 52
(0-51) и устанавливаете abc[52] = '\0'.
@JAMESBRYANB.Juventud - неправильно. Массив размера 52
имеет допустимые индексы в диапазоне от 0-51
, которые цикл for
OP заполняет символами. Без увеличения емкости массива некуда было бы добавлять нулевой символ в конце. Теперь вы понимаете, зачем нужен +1
?
%s
означает, что строка и строки C заканчиваются нулем.pass
должен иметь размер 3, а последний элемент должен быть равен 0. В противном случае вы получите UB.