strncpy не хранит символы правильно C
В основном я использую strncpy
усечь символы, если они больше, чем размер массива символов.
Итак, у меня есть следующие переменные и методы.
char studentName[6];
char colour[5];
char music[7];
strcpy(this->studentName, "null");
strcpy(this->colour, "null");
strcpy(this->music, "null"):
void setName (char* studentName)
{
strncpy(this->studentName, studentName, 6);
this->studentName[6] = '\0'; // SET LAST TO NULL POINTER
}
void setColour (char* colour)
{
strncpy(this->colour, colour, 5);
this->colour[5] = '\0'; // SET LAST TO NULL POINTER
}
void setMusic (char* music)
{
strncpy(this->music, music, 7);
this->music[7] = '\0'; // SET LAST TO NULL POINTER
}
Итак, если я установлю имя студента на Jackson
, оно будет усечено до Jackso
однако мой colour
переменная будет пустой и мой music
переменная будет null
,
Кроме того, если я попробую...
void setName (char* studentName)
{
strncpy(this->studentName, studentName, 6);
this->studentName[6-1] = '\0'; // SET LAST TO NULL POINTER
}
void setColour (char* colour)
{
strncpy(this->colour, colour, 5);
this->colour[5-1] = '\0'; // SET LAST TO NULL POINTER
}
void setMusic (char* music)
{
strncpy(this->music, music, 7);
this->music[7-1] = '\0'; // SET LAST TO NULL POINTER
}
и я установил имя студента на Jackson
Я получаю что-то вроде Jacksonull
, Добавляет null
к концу
2 ответа
Здесь (предполагается, что платформа Linux. Возможно, вам придется получить реализацию strlcpy, если вы используете Windows, не уверен.)
#include <bsd/string.h>
char studentName[6]; /* Good to know: Globals are initialized to zero */
char colour[5];
char music[7];
/* Pretty useless function since a single strlcpy call is enough */
static size_t setX(char *buf, size_t buflen, const char *new_val) {
return strlcpy(buf, new_val, buflen);
}
int main(int argc, char **argv) {
setX(studentName, 6, "Peter"); /* Please read man page and check return value */
}
Сейчас strlcpy
гарантирует завершение NUL, пока аргумент длины>0.
Попробуйте использовать sizeof()
вместо необработанных чисел. Это позволяет вам изменять размеры массива, не касаясь вашего кода.
Вы первый экземпляр sizeof(array)-1
символы, а затем установить последний символ, который имеет индекс sizeof(array)-1
(потому что индексация начинается с 0) '\0'
,
Ваш отредактированный код будет выглядеть так:
char studentName[6];
char colour[5];
char music[7];
strcpy(this->studentName, "null");
strcpy(this->colour, "null");
strcpy(this->music, "null"):
void setName (char* studentName)
{
strncpy(this->studentName, studentName, sizeof(this->studentName)-1); // Copy n-1 chars
this->studentName[sizeof(this->studentName)-1] = '\0'; // n is set to null symbol
}
void setColour (char* colour)
{
strncpy(this->colour, colour, sizeof(this->color)-1);
this->colour[sizeof(this->color)-1] = '\0';
}
void setMusic (char* music)
{
strncpy(this->music, music, sizeof(this->music)-1);
this->music[sizeof(this->music)-1] = '\0';
}