I do something like this...
case lcd.write_line(char* alias data, int line): {
lcd_setcursor(1, line, rs, e, data_port);
string_len[line] = strlen(data) > COLUMNS ? COLUMNS : strlen(data);
str_len = string_len[line] > MAX_PRINT ? MAX_PRINT : string_len[line];
//Send data to LCD
for (size_t i = 0; i < str_len; ++i)
lcd_write(data[i], rs, e, data_port);
//Make sure no extra chars draw, copy string
for (size_t i = str_len; i < MAX_PRINT; ++i) lcd_write(SPACE, rs, e, data_port);
strcpy(lcd_data[line], data);
//Reset scrolling logic
if (line == cursor_line) {
LCDTIMER :> last_scroll;
start_char = roll_time = 0;
}
break;
}