В основном я хочу знать, можно ли (если да, то как) читать строку слева направо и жадно завершать и добавлять, как только будет найдена новая строка. Например.
"ABCABCABCABC" даст {"A" "B" "C" "AB" "CA" "BC" "ABC"}
Я пытался весь день, и все, что у меня получилось, - это сломанный код и сбои программ.
Это то, что у меня не работает. Массив определяется как * a [linelen]
for(i =0; i < linelen ;i++)
{
j=0;
k=0;
tempstr[j] = input[i]; // move character from input to tempstring
for(k=0; k< array_size; k++) //search through array
{
tempstr[j] = input[i];
if(*a != tempstr)//(strcmp(a,tempstr)) != 0) // if str not in array
{
printf("%s\n", a[0]); //debug
a[array_size] = tempstr;
//strcpy(a[array_size], tempstr); //copy str into array
array_size++;
memset(tempstr,0,linelen-i); // reset tempstr to empty
j=0;
}
if( *a == tempstr)//(strcmp(a[array_size],tempstr)) == 0)
{
j++;
tempstr[j] = input[i+1];
if(i != linelen -1) // otherwise if tempstr already in array
{
printf("%s\n",a[0]); //debug
j++;
tempstr[j] = input[i+1];
}
else if (i == linelen -1) // if it is the last letter
{
a[array_size] = tempstr;
//strcpy(a[array_size], tempstr); // add to array
break;
}
}
}
}
strstr()
в конечном итоге должны это сделать. Можно ли это сделать эффективно? Без понятия. - person EOF   schedule 18.10.2015char *a[linelen];
, тогда проблема просто в том, что вы обращаетесь к неинициализированной памяти - у вас есть массив указателей, но эти указатели никуда не указывают, и вы никогда не выделяете им память, чтобы они указывали на . Подумайте о написании собственного специального вариантаstrdup()
с такой подписью, какchar *dup_char_range(const char *start, int len);
- это не требует ввода строки с завершающим нулем, что, вероятно, подходит для вашей проблемы. - person Jonathan Leffler   schedule 18.10.2015strcmp()
требует строк с завершающим нулем. Я думаю, что ваш код не завершает строки нулем. - person Jonathan Leffler   schedule 18.10.2015memcmp
илиstrncmp
из-за того, что вы не можете завершать каждую подстроку нулевым символом (иначе вы разделите ababc на ab и bc, перезаписав a в abc). Если вы хотите использовать два отдельных массива, один для размеров, а другой для указателей, вы также можете это сделать. Это решение предполагает, что вы не знаетеmalloc
. - person   schedule 18.10.2015