1) sscanf ()
С sscanf()
вы можете сделать
sscanf(lineStr, "%7c%5c%5c%7c%6c", a, b, c, d, e);
a[7]=b[5]=c[5]=d[7]=e[6]='\0';
%c
может использоваться для чтения более 1 байта. %7c
будет читать до 7 байтов. Но \0
не будет добавлено автоматически.
Спасибо за этот метод chqrlie .
или просто
sscanf(lineStr, "%7s%5s%5s%7s%6s", a, b, c, d, e);
если lineStr
не имеет пробелов.
Или, может быть
sscanf(lineStr, "%7[^\n]%5[^\n]%5[^\n]%7[^\n]%6[^\n]", a, b, c, d, e);
, если lineStr
не имеет \n
символов.
где числа в строке формата обозначают ширину копируемых подстрок.
Таким образом, вам не нужно \0
завершать строки вручную. sscanf()
позаботится об этом.
2) strncpy ()
Если вы должны использовать `strncpy (), вы на правильном пути. Вы могли бы сделать
void breakString(const char *lineStr) {
char a[8];
char b[6];
char c[6];
char d[8];
char e[7];
strncpy(a, lineStr, 7);
a[7]='\0';
lineStr+=7;
strncpy(b, lineStr, 5);
b[5]='\0';
lineStr+=5;
strncpy(c, lineStr, 5);
c[5]='\0';
lineStr+=5;
strncpy(d, lineStr, 7);
d[7]='\0';
lineStr+=7;
strncpy(e, lineStr, 6);
e[6]='\0';
//lineStr+=6;
}
Обратите внимание, что для хранения символа \0
для строк необходим дополнительный один байт. Таким образом, размеры массивов соответственно меняются.