strncpy и использующий sizeof для копирования максимальные символы

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()]);
}
6
задан ant2009 24 July 2009 в 09:58
поделиться

5 ответов

Если длина источника на меньше, чем , максимальное число, переданное в качестве третьего параметра, strncpy завершит назначение нулем, в противном случае - нет.

Если источник равен или больше по длине, чем пункт назначения - это ваша проблема. Выполнение того, что вы предлагаете - вызов strlen () - не сработает, поскольку буфер не будет завершаться нулем, и вы столкнетесь с неопределенным поведением.

Вы можете выделить больший буфер:

char buffer[bufferSize + 1];
strncpy( buffer, source, bufferSize );
*(buffer + bufferSize ) = 0;
6
ответ дан 8 December 2019 в 03:54
поделиться

strncpy не будет завершать адрес назначения нулем, если он усекает строку. Если вы должны использовать strncpy , вам необходимо убедиться, что результат прерван, что-то вроде:

strncpy(call, info.called, sizeof(call) - 1);
call[sizeof(call) - 1] = '\0';

BSD strlcpy () , среди прочего, обычно считается лучшим:

http://www.openbsd.org/cgi-bin/man. cgi? query = strlcpy

15
ответ дан 8 December 2019 в 03:54
поделиться

Ваша идея:

call[strlen(call) - 1] = '\0';

не будет работать, так как вы вызываете strlen () для строки без завершения

4
ответ дан 8 December 2019 в 03:54
поделиться

Но теперь мне интересно, завершит ли он адрес назначения нулевым символом.

Нет, 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
ответ дан 8 December 2019 в 03:54
поделиться

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) Если источник короче, чем место назначения, место назначения будет завершено нулем.

1
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: