Копирование элементов из одного массива символов в другой

Я хотела перевести из строки в другую строку, и, следовательно, написал следующую программу. Первоначально я думал, что цикл for должен выполняться до нулевого символа (включая его i.e) был скопирован. Но в этом коде цикл for завершается, если найден нулевой символ (i.e, еще не скопирован), но он все еще может отображать строку, в которую были скопированы элементы. Как это возможно, если в первом нет нулевого символа место?

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

int main()
{
    char temp[100], str[100];
    fgets(str, 100, stdin);
    int i;
    for(i = 0; str[i]!=''; i++)
    {
        temp[i] = str[i];
    }
    puts(temp);
    return 0;
}

3 ответов


на использует size_t strlen(const char *) и выход этой функции неопределено когда в переданном аргументе нет нулевого Терминатора (см. ответ). Так что в вашем случае strlen внутри puts вероятно, найдено значение 0 "рядом" с вашим массивом в памяти, что приводит к правильному поведению puts, однако это не всегда так, как это определено.


вот вход и выход на моем компьютере:

0
0
絯忐`

Process returned 0 (0x0)   execution time : 1.863 s
Press any key to continue.

видите мусор "絯忐'"? Это неопределенное поведение. Ваша программа работает хорошо, потому что вы (un)lucky.

опять же, неопределенное поведение не заслуживает много обсуждение.


при объявлении char temp[100] не инициализируя его ни к чему, он просто принимает неинициализированную память. Это воспоминание может быть чем угодно. Например, следующая программа запишет начальное содержимое этого, как целые числа:

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

int main()
{
    char temp[100];
    int i;
    for(i = 0; i < 100 ; i++)
    {
        fprintf(stdout, "%d ", temp[i]);
    }
    return 0;
}

это печатает последовательно разные выходные данные для меня, хотя по какой-то случайности он продолжает печатать разделы нулей. например:

88 -70 43 81 -1 127 0 0 88 -70 43 81 -1 127 0 0 1 0 0 0 0 0 0 0 112 -70 43 81 -1 127 0 0 0 64 -108 14 1 0 0 0 72 50 -13 110 -1 127 0 0 -128 -70 43 81 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 -70 43 81

88 90 72 88 -1 127 0 0 88 90 72 88 -1 127 0 0 1 0 0 0 0 0 0 0 112 90 72 88 -1 127 0 0 0 -96 119 7 1 0 0 0 72 18 72 105 -1 127 0 0 -128 90 72 88 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 90 72 88

88 -6 -79 87 -1 127 0 0 88 -6 -79 87 -1 127 0 0 1 0 0 0 0 0 0 0 112 -6 -79 87 -1 127 0 0 0 0 14 8 1 0 0 0 72 34 57 104 -1 127 0 0 -128 -6 -79 87 -1 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 -6 -79 87

что скорее всего происходит это ваша строка с ненулевым завершением случайно завершается null в силу того, что temp[strlen(str)] - это, по счастливой случайности, .