Конкатенация строк в C? - PullRequest
       8

Конкатенация строк в C?

0 голосов
/ 29 сентября 2018

Я пытаюсь понять поведение строки в C, и это беспокоит меня, так как мои следующие два фрагмента кода приводят к разным выводам: (Ради этого вопроса, давайте предположим, что пользователь вводит 12)

int main(void)  
{
    char L_Red[2];
    char temp[] = "I";
    printf("Enter pin connected to red: ");
    scanf("%s", L_Red);
    strcat(temp,L_Red);
    printf("%s \n", temp);
    return 0;
}

это дает: 12 как вывод (а не I12) Почему?

int main(void)  
{
    char L_Red[2];
    printf("Enter pin connected to red: ");
    scanf("%s", L_Red);
    char temp[] = "I";
    strcat(temp,L_Red);
    printf("%s \n", temp);
    return 0;
}

Это дает: I12I (а не I12) Почему?

Я прочитал о строке в C иНасколько я понимаю, я не назначаю временный фиксированный размер и не изменяю его позже для получения этих расплывчатых выводов, а также не использую строки, как они не должны.Есть ли здесь какая-то другая концепция?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

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

0 голосов
/ 29 сентября 2018

Массив temp представляет собой массив из двух символов ('I' и ограничитель строки '\0').Вот и все.Попытка добавить больше символов в этот массив приведет к записи за пределами и приведет к неопределенному поведению .

Вам необходимо убедиться, чтоВ массиве назначения temp имеется достаточно места для его исходного содержимого плюс строка, которую вы хотите добавить (плюс терминатор).


Кроме того, если вы хотите ввести болееодин символ для «строки» L_Red, вам также необходимо увеличить ее размер.

Я также рекомендую использовать ограничение в спецификаторе формата, чтобы вы не могли записать изграницы:

char L_Red[3];  // Space for two characters, plus terminator
scanf("%2s", L_Red);  // Read at most two characters of input
...