2014-11-20 2 views
1

У меня есть задача сделать небольшую программу с указателями, и перед нами стоит проблема с const char*s. Программа предназначена для подсчета количества раз, когда подстрока отображается в основной строке. Кроме того, различные позиции, где начинаются подстроки, должны быть сохранены в char ** ptr. Это мой маленький код тестирования:Подсчет подстрок в строке

#include <stdio.h> 
#include <string.h> 

main() 
{ 
    int i=-1; 
    int k=0; 
    char** ptr; 
    char* str="cucumber"; 
    char* substr="cu"; 

    while(strstr(str, substr)!=NULL) 
     { 
      i++; 
      ptr[i]=strstr(str, substr); 
      str = strpbrk(str, substr)+1; 
      k++; 
     } 

    printf("%i",k); 
} 

Он должен печатать 2, так как подстрока «у.е.» появляется 2 раза в «огурец» - все же, мой компилятор говорит мне, что я использую символы, когда я используйте постоянные. Кроме того, я не знаю, как это сделать.

Функция strstr() требует их. Что я должен изменить?

+0

выполнения этой программы (если он будет компилировать) приведет к неопределенному поведению, так как установка PTR [х] будет пытаться записать в массив PTR, однако , ptr объявляется как один указатель, а не как массив. – user3629249

+0

Чувак, которого вы пишете в нераспределенной памяти. Вы не выделили память для char ** ptr; – siu

+0

Домашнее задание снова! – siu

ответ

0
// note: 
// 1) correction to declaration of main() 
// 2) addition of return statement 
// 3) 'substr' is a poor name choice for a variable, as 
// a) it looks like a C lib function (it is a ACL library function) 
// b) it does not clearly convey what the variable contains 
// 4) clutter in the 'while' loop removed 
// 5) 'while' loop is replaced by a 'for' loop so more can be accomplished with less code 
// 6) unneeded variables are eliminated 
// 7) the 'for' loop stops when there is no possibility of further testStr occurrences 
// 8) the printf() clearly indicates what is being printed 



#include <stdio.h> 
#include <string.h> 

int main() 
{ 

    char* testStr="cucumber"; 
    char* findStr="cu"; 
    int k = 0; 

    for(int i=0; strlen(&testStr[i]) >= strlen(findStr); i++) 
    { 
     if(strstr(&testStr[i], findStr) != NULL) 
     { 
      k++; 
     } 
    } 
    printf("\nnumber of occurrences of %s in %s is %d\n", findStr, testStr, k); 

    return(0); 
} 
+0

Этот код очень неэффективен. Все эти повторные вызовы strlen не нужны. – Lundin

+0

спасибо за ваши усилия =) У меня все еще есть проблемы с пониманием: как важна длина строки и, более того: не будет ли strlen testStr всегда выше, чем findStr? Цикл for не закончится, не так ли? – HannahAround

+0

Кроме того, мой компилятор говорит: «[Error]» для «начальных объявлений цикла» разрешено только в режиме C99 » – HannahAround

0

Выделяет память для хранения указателя значения

#include <stdio.h> 
#include <string.h> 

#define MAX_SUB_STR 10 
int main() 
{ 
    int i; 
    int k; 
    char* ptr[MAX_SUB_STR]; 
    char* str="cucumber"; 
    char* temp; 
    char* substr="cu"; 

    i = 0; 
    k = 0; 
    temp = str; 
    while(strstr(temp, substr)!=NULL && k < MAX_SUB_STR) 
     { 
      ptr[k]=strstr(temp, substr); 
      temp = ptr[k] + strlen(substr); 
      k++; 
     } 

    printf("%i\n",k); 
    for (i = 0; i < k; i++) 
     printf("%p\n",ptr[i]); 
    return 0; 
} 
Смежные вопросы