Смотрите также C TokenizerЯвляется ли это хорошим субстратом для C?
Вот быстрый зиЬзЬг() для C, что я написал (да, переменная инициализации должна быть перемещена в начале функции и т.д., но вы получите идею)
Я видел много «умных» реализаций substr(), которые простые однолинейные вызовы strncpy()!
Они все неправильно (strncpy не гарантирует нулевое окончание и, таким образом, вызов может НЕ произвести правильную подстроку!)
Вот что-то может быть лучше?
Вывести ошибки!
char* substr(const char* text, int nStartingPos, int nRun)
{
char* emptyString = strdup(""); /* C'mon! This cannot fail */
if(text == NULL) return emptyString;
int textLen = strlen(text);
--nStartingPos;
if((nStartingPos < 0) || (nRun <= 0) || (textLen == 0) || (textLen < nStartingPos)) return emptyString;
char* returnString = (char *)calloc((1 + nRun), sizeof(char));
if(returnString == NULL) return emptyString;
strncat(returnString, (nStartingPos + text), nRun);
/* We do not need emptyString anymore from this point onwards */
free(emptyString);
emptyString = NULL;
return returnString;
}
int main()
{
const char *text = "-2--4--6-7-8-9-10-11-";
char *p = substr(text, -1, 2);
printf("[*]'%s' (\")\n", ((p == NULL) ? "<NULL>" : p));
free(p);
p = substr(text, 1, 2);
printf("[*]'%s' (-2)\n", ((p == NULL) ? "<NULL>" : p));
free(p);
p = substr(text, 3, 2);
printf("[*]'%s' (--)\n", ((p == NULL) ? "<NULL>" : p));
free(p);
p = substr(text, 16, 2);
printf("[*]'%s' (10)\n", ((p == NULL) ? "<NULL>" : p));
free(p);
p = substr(text, 16, 20);
printf("[*]'%s' (10-11-)\n", ((p == NULL) ? "<NULL>" : p));
free(p);
p = substr(text, 100, 2);
printf("[*]'%s' (\")\n", ((p == NULL) ? "<NULL>" : p));
free(p);
p = substr(text, 1, 0);
printf("[*]'%s' (\")\n", ((p == NULL) ? "<NULL>" : p));
free(p);
return 0;
}
Выход:
[*]'' (")
[*]'-2' (-2)
[*]'--' (--)
[*]'10' (10)
[*]'10-11-' (10-11-)
[*]'' (")
[*]'' (")
Пока мы на нем, printf ("% s \ n", NULL) будет печатать "(null) \ n", а не сбой в какой-либо массовой ошибке, поэтому вам не нужно проверять, NULL внутри вашего printf() s. –
На самом деле, я не могу найти что-либо в каких-либо стандартах относительно поведения printf() при задании NULL как строки, но это то, что он делает в моей системе (OS X Leopard). –
Да, Chris, у меня тоже есть (нуль) на всех ОС, над которыми я работал, но затем strcmp() с NULL сбрасываемым ядром на Solaris (или это был HP-UX?), Но он не делает этого на других. так зачем беспокоиться с небольшой тройной? – PoorLuzer