hasherfrog
06-07-2004, 13:01
Стандартная ошибка начинающего (и не только) программиста - переполнение буфера при копировании строк. Вот не совсем корректный код:
#define SZSIZE 100
char sz[SZSIZE];
strcpy(sz, pszSomeData);
Совсем не вариант, который тем не менее часто используют (100 - как пример):
char sz[SZSIZE*100];
strcpy(sz, pszSomeData);
Более приемлимый вариант:
char sz[SZSIZE];
strncpy(sz, pszSomeData, sizeof(sz));
Но тут есть неприятность - последний символ может оказаться не 0. Тогда последующий strlen(sz) может дать сбой. Очевидно, если предусмотреть и эту возможность, надо предохраниться, дописав нулик руками. Но вот какой вариант "красивее"?
Такой:
char sz[SZSIZE];
strncpy(sz, pszSomeData, sizeof(sz) - 1);
strcat(sz, "\0");
Или такой:
char sz[SZSIZE + 1];
strncpy(sz, pszSomeData, SZSIZE);
sz[SZSIZE] = '\0';
Или такой:
char sz[SZSIZE];
strncpy(sz, pszSomeData, sizeof(sz));
sz[SZSIZE - 1] = '\0';
Может, ещё кто какой вариант знает?
Добавлено:
О, забыл.
char sz[SZSIZE];
memset(sz, 0, sizeof(sz));
strncpy(sz, pszSomeData, sizeof(sz) - 1);
Очевидно, что memset придётся вызывать каждый раз перед копированием.
#define SZSIZE 100
char sz[SZSIZE];
strcpy(sz, pszSomeData);
Совсем не вариант, который тем не менее часто используют (100 - как пример):
char sz[SZSIZE*100];
strcpy(sz, pszSomeData);
Более приемлимый вариант:
char sz[SZSIZE];
strncpy(sz, pszSomeData, sizeof(sz));
Но тут есть неприятность - последний символ может оказаться не 0. Тогда последующий strlen(sz) может дать сбой. Очевидно, если предусмотреть и эту возможность, надо предохраниться, дописав нулик руками. Но вот какой вариант "красивее"?
Такой:
char sz[SZSIZE];
strncpy(sz, pszSomeData, sizeof(sz) - 1);
strcat(sz, "\0");
Или такой:
char sz[SZSIZE + 1];
strncpy(sz, pszSomeData, SZSIZE);
sz[SZSIZE] = '\0';
Или такой:
char sz[SZSIZE];
strncpy(sz, pszSomeData, sizeof(sz));
sz[SZSIZE - 1] = '\0';
Может, ещё кто какой вариант знает?
Добавлено:
О, забыл.
char sz[SZSIZE];
memset(sz, 0, sizeof(sz));
strncpy(sz, pszSomeData, sizeof(sz) - 1);
Очевидно, что memset придётся вызывать каждый раз перед копированием.