Вчера у меня был тестовый модуль.Одной из программ было копирование строк и определение их длины без использования строковых функций.Это был код, который я написал:
#include <stdio.h>
int main(){
char str1[100], str2[100] = {'a'};
printf("Enter a string\n");
fgets(str1, sizeof(str1), stdin);
int i;
for(i = 0; str1[i] != '\0'; i++){
str2[i] = str1[i];
}
str2[i] = '\0';
printf("Copied string = %s", str2);
printf("Length of string = %d", i-1);
}
У меня было довольно удивительное наблюдение!Даже если закомментировано str2[i] = '\0'
, строка будет напечатана правильно, т.е. без лишних 'a'
с при инициализации, которые не должны быть перезаписаны, насколько мне известно.
После комментирования str2[i] = '\0'
, я ожидалчтобы увидеть этот вывод:
test
Copied string = testaaaaaaaaaaaaaaaaaaaaaaaaaaa....
Length of string = 4
Это вывод:
test
Copied string = test
Length of string = 4
Как правильно печатается str2
?Это тот факт, что компилятор распознал копирование строки и тихо добавил нулевое завершение?Я использую GCC, но Clang также производит аналогичные выходные данные.