Я должен загрузить список имен из файла, а затем найти эти имена во втором файле и загрузить их в структуру с некоторыми другими данными (для простоты я буду загрузить их в другой массив под названием «тест».Получение странных символов из функции strncpy()
Первая часть просто отлично, я открываю файл и загружать все имена в 2dimensional массив называется namesArr. Вторая часть где происходят неожиданные символы, и я не могу понять, почему. Вот код функции:
void loadStructure(void){
char line[MAX_PL_LENGTH], *found;
int i, j=0;
char test[20][20];
FILE *plotPtr=fopen(PLOT_FILE_PATH, "r");
if (plotPtr==NULL){perror("Error 05:\nError opening a file in loadStructure function. Check the file path"); exit(-5);}
while(fgets(line, MAX_PL_LENGTH, plotPtr)!=NULL){ // This will load each line from a file to an array "line" until it reaches the end of file.
for(i=0; i<numOfNames; i++){ // Looping through the "namesArr" array, which contains the list of 20 character names.
if((found=strstr(line, namesArr[i]))!=NULL){ // I use strstr() to find if any of those names appear in the particular line.
printf("** %s", found); // Used of debugging.
strncpy(test[j], found, strlen(namesArr[i])); j++; // Copying the newly found name to test[j] (copying only the name, by defining it's length, which is calculated by strlen function).
}
}
}
fclose(plotPtr);
printf("%s\n", test[0]);
printf("%s\n", test[1]);
printf("%s\n", test[2]);
}
Это выход я получаю:
...20 names were loaded from the "../Les-Mis-Names-20.txt".
** Leblanc, casting
** Fabantou seems to me to be better," went on M. Leblanc, casting
** Jondrette woman, as she stood
Leblanct╕&q
Fabantou
Jondretteⁿ └
Process returned 0 (0x0) execution time : 0.005 s
Press any key to continue.
Вопрос, почему я получаю символы, такие как «╕ & д» и «ⁿ └» во вновь созданный массив? А также есть ли еще более эффективный способ добиться того, что я пытаюсь сделать?
вам нужно добавить нуль-терминатор к 'тест [J]' после strncpy –
Ограничение длины для 'strncpy' должны быть основаны на целевом размере, не длина источника: это точка его использования над 'strcpy', который использует только длину источника. –
для удобства понимания и удобочитаемости нами людей: 1) следовать аксиоме: * только один оператор в строке и (самое большее) одно объявление переменной для каждого оператора: * 2) отдельные блоки кода (для if, else, while, do ... while, switch, case, default) через пустую строку. – user3629249