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)
)