Я ожидал, что цикл будет копировать нулевой символ или что-то еще, но он снова копирует символ с самого начала.Это почему?Как работает этот цикл? - PullRequest
0 голосов
/ 15 февраля 2019

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

#include <stdio.h>[enter image description here][1]
#include <string.h>

int main()
{
    int c=0;
    char a[10],x[5]="hamme";
while(c<10)
    {
        a[c]=x[c];
    c++;
    }
    printf("%s",a);
    return 0;

}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

C разрешает прямой доступ к памяти вашей программы, когда мы пытаемся назначить что-либо большее, чем индекс в чем-либо.Может вызвать неожиданную ошибку.Этого не должно быть.Массив - это не что иное, как указатель на область памяти.Другими словами, some_array [i] совпадает с * (some_array + i) , а также some_array [i] также совпадает с i [some_array] !

0 голосов
/ 15 февраля 2019

x[5]="hamme"

Создает массив символов из 5 символов, а не строку с "hamme", для хранения которой требуется 6 символов (напомним, что для хранения требуется нуль-символ в конце)

При циклическом while(c<10) вы вызываете Неопределенное поведение , читая после конца (за пределами массива) x.

Ваше "иногда копирует, а иногда нет" - результат Неопределенное поведение .

Если вы объявите char x[] = "hamme";, тогда x будетинициализирован, чтобы включать нуль-завершающий символ , и вы можете просто зацикливаться, пока он не будет скопирован в a, например,

#include <stdio.h>

int main (void) {

    int c = 0;
    char a[10],
        x[] = "hamme";

    do
        a[c] = x[c];
    while (x[c++]);

    printf ("%s\n", a);

    return 0;
}

( примечание: вы должныубедитесь, что a имеет достаточно места для хранения строки в x, в противном случае вы вернетесь к лодке Undefined Behavior .

Чтобы этого не произошло, вы можете включить string.h и сравните длину x ( плюс 1) с хранилищем, доступным в a[] and копировать, только если этого достаточно, например,

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

int main (void) {

    size_t c = 0;
    char a[10],
        x[] = "hamme";

    if (strlen (x) + 1 > sizeof a) {
        fputs ("error, length of x exceeds storage in a.\n", stderr);
        return 1;
    }

    do
        a[c] = x[c];
    while (x[c++]);

    printf ("%s\n", a);

    return 0;
}

( note изменение типа для c с int на size_t, чтобы избежать сравнения между подписанным и неподписаннымзначения в if (strlen (x) + 1 > sizeof a))

...