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'; 
}
Другие вопросы по тегам