public static String[] toArray(String[]... object){
List<String> list=new ArrayList<>();
for (String[] i : object) {
list.addAll(Arrays.asList(i));
}
return list.toArray(new String[list.size()]);
}
Если длина источника на меньше, чем , максимальное число, переданное в качестве третьего параметра, strncpy завершит назначение нулем, в противном случае - нет.
Если источник равен или больше по длине, чем пункт назначения - это ваша проблема. Выполнение того, что вы предлагаете - вызов strlen () - не сработает, поскольку буфер не будет завершаться нулем, и вы столкнетесь с неопределенным поведением.
Вы можете выделить больший буфер:
char buffer[bufferSize + 1];
strncpy( buffer, source, bufferSize );
*(buffer + bufferSize ) = 0;
strncpy
не будет завершать адрес назначения нулем, если он усекает строку. Если вы должны использовать strncpy
, вам необходимо убедиться, что результат прерван, что-то вроде:
strncpy(call, info.called, sizeof(call) - 1);
call[sizeof(call) - 1] = '\0';
BSD strlcpy ()
, среди прочего, обычно считается лучшим:
Ваша идея:
call[strlen(call) - 1] = '\0';
не будет работать, так как вы вызываете strlen ()
для строки без завершения
Но теперь мне интересно, завершит ли он адрес назначения нулевым символом.
Нет, strncpy не обещает, что целевая строка будет завершена нулем.
char tar[2]={0,0};
char bar="AB";
strncpy(tar,bar,2);
// result tar[0]=='A'; tar[1]=='B'
Чтобы исправить это, вы должны использовать:
strncpy(traget,string,sizeof(target)-1);
target[sizeof(target)-1]=0
1) From cplusplus.com : "Никакой нулевой символ не добавляется неявно к концу пункта назначения, поэтому пункт назначения будет оканчиваться нулем только в том случае, если длина строки C в источнике меньше числа." Итак, если вам нужно, чтобы ваша строка оканчивалась нулем, вам нужно сделать следующее:
call[sizeof(call) - 1] = '\0';
Хороший способ сделать это - написать функцию-оболочку для strncpy
, которая всегда проверяет, является ли строка завершено.
2) Если источник короче пункта назначения, пункт назначения будет завершен нулем.
com : «Никакой нулевой символ не добавляется неявно к концу пункта назначения, поэтому пункт назначения будет оканчиваться нулем только в том случае, если длина строки C в источнике меньше числа». Итак, если вам нужно, чтобы ваша строка оканчивалась нулем, вам нужно сделать следующее:call[sizeof(call) - 1] = '\0';
Хороший способ сделать это - написать функцию-оболочку для strncpy
, которая всегда проверяет, является ли строка завершено.
2) Если источник короче пункта назначения, пункт назначения будет завершен нулем.
com : «Никакой нулевой символ не добавляется неявно к концу пункта назначения, поэтому пункт назначения будет оканчиваться нулем только в том случае, если длина строки C в источнике меньше числа». Итак, если вам нужно, чтобы ваша строка оканчивалась нулем, вам нужно сделать следующее:call[sizeof(call) - 1] = '\0';
Хороший способ сделать это - написать функцию-оболочку для strncpy
, которая всегда проверяет, является ли строка завершено.
2) Если источник короче, чем место назначения, место назначения будет завершено нулем.