singlepost

Вопрос про строковые функции в C++ << На главную или назад  

Выложил частично блок программы в котором вопрос-вопрос по переводу периодической дроби: вопрос следущий я вообще правильно сделал когда функцией strtok выделял указатели на строки и заносил их в массив(при запуске-вроде бы все нормально отделяет и выводитнапример 4.4(45) я разбиваю эту строку на строки a[0]=4a[1]= 4 и a[3]=45 а потом ими оперирую дальше) и 2 вопрос: почему strcat(s1,a[0]) -не cоединяет строки просто я с этими указателями путаюсь(( вот и вопрос

#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>

//описание функций

int main()
{ int i,j=0,sd1,sd2,nod;
char s[80],a[3],*pa=NULL,*p=NULL,*s1,*s11=new char[17],*s22=new char[17],*s2,*sp1,*sp2,razd[]="().\0\n";

printf("vvedite des9itititnoe chislo\n");
scanf("%s",&s);
p=s;
// здесь еще кусок проги должен но он работает дык что его ввыкладывать нет смысла:)
//вычисления для периодической дроби
{
p = strtok(s,razd);
i=0;
a[i]=p;
while(p = strtok(NULL,razd))
{
i++;
a[i]=p;

}
for(i=0;i<3;i++)
printf("a[%d]=%s\n",i,a[i]);

strcat(s1,a[0]);
strcat(s1,a[1]);
strcat(s1,a[2]);

strcat(s2,a[0]);
strcat(s2,a[1]);
sd1=atoi(s1)-atoi(s2);//числитель
printf("sd1=%s\n",s1);
sd2=pow(10,strlen(a[1]))*9*KOL_9( a[2]); //знаменатель
}

return 0;
}

19 ответов в теме “Вопрос про строковые функции в C++”

  1. 19
    Дмитрий Гайдамович ответил:

    Александр "Ksandr" Нестеров, STL – это стандартная библиотека для С++. Вы как-то странно изучаете С++, если вы о ней не слыхивали.

  2. 18
    Александр Нестеров ответил:

    мдя(((если я попросил помочь по с++ -это не значит что я должен эту прогу писать на с……к тому же я не понял проги которую написал Сергей-и что такое STL-тож не знаю….я изучаю на данный момент С++

  3. 17
    Vlad Ламбар ответил:

    Да называют С++ ибо процедурный С свое отжил в "академических" кругах, а на замену пришел С++ с ООП. А поскольку дальше после всех елементов С, пойдут класы и все с этим связаные принципы ООП и особенности плюсов. То и весь курс называют "С++" при этом дальше используя для ввода/вывода scanf/printf вместо cin/cout.

    Все кажись просто как двери, хотя со стороны немного глупо. У нас разделяли С и С++ когда я его учил…наверно зависит от преподавателя

  4. 16
    Дмитрий Гайдамович ответил:

    Да, я подразумевал то же, что Сергей. Если использовать stdlib, то зачем С++? Ведь достаточно простого С. Это, кстати общее для большинства рассматриваемых здесь примеров. Люди называют это "С++" и обмениваются знаниями по поводу С-шного runtime-а. Наверно, такие преподы, я не знаю, странно всё это. Если писать на С++, то класс std::string действительно способен сильно упростить жизнь.

  5. 15
    Сергей Кривонос ответил:

    #include <string>
    #include <vector>
    using namespace std;

    vector<string> tokenize(const string& str,const string& delimiters)
    {
    vector<string> tokens;

    // skip delimiters at beginning.
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);

    // find first "non-delimiter".
    string::size_type pos = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
    // found a token, add it to the vector.
    tokens.push_back(str.substr(lastPos, pos – lastPos));

    // skip delimiters.Note the "not_of"
    lastPos = str.find_first_not_of(delimiters, pos);

    // find next "non-delimiter"
    pos = str.find_first_of(delimiters, lastPos);
    }

    return tokens;
    }

  6. 14
    Сергей Кривонос ответил:

    юзайте STL

  7. 13
    Александр Нестеров ответил:

    Дмитрий ,как понять твой вопрос: а зачем вам ++?

  8. 12
    Дмитрий Гайдамович ответил:

    Ребята, а зачем вам ++?

  9. 11
    Александр Нестеров ответил:

    int i;
    char s[80],*a[3],*p=NULL,*s1,*s2,*sp1,*sp2,razd[]="().\0\n";

    {
    p = strtok(s,razd);
    i=0;
    a[0]=p;
    while(p = strtok(NULL,razd))
    {
    i++;
    a[i]=p;
    }

    for(i=0;i<3;i++)
    printf("a[%d]=%s\n\n",i,a[i]);

    данный кодработает и выдает то что нужно : но проблема в следующим
    strcat(a[0],a[1])работает и соединяет строки массива , но strcat(s1,a[1]) -не хочет вообще в чем проблема???-помогите..

  10. 10
    Александр Нестеров ответил:

    конечно спасибо но этот код который ты предоставил-выводит строки…а я же написал что как мне запоминать их что бы работать дальше?запоминать указатели вв массив не катит( как мне сказали) а как тогда их запоминать ? конечно есть вариант просмотреть данную строку как масссив и разбить на части -но это просто и требует больше кода…а как это реалтизовать в данном случае?????

  11. 9
    Vlad Ламбар ответил:

    short j;
    while( p = strtok( NULL,razd ) )
    {
    j=0;
    while( p[j] != '/0' )
    {
    a[i++] = p[j++];
    }
    }

    так попробуй…или не в этом проблема?

  12. 8
    Vlad Ламбар ответил:

    int main ()
    {
    char str[] ="- This, a sample string.";
    char * pch;
    printf ("Splitting string \"%s\" into tokens:\n",str);
    pch = strtok (str," ,.-");
    while (pch != NULL)
    {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
    }
    return 0;
    }
    Вот вывод:
    Splitting string "- This, a sample string." into tokens:
    This
    a
    sample
    string

    _______________

    если не ошибаюсь то в твоем случае а[i] присваивать не "р", а в цикле смещать "i, j" и присваивать "р[j]" пока (р != NULL)

    ну тоесть в цикле доступаться к елементам строки на какую указывает указатель полученый после strtok и присваивать их куда там уже надо.
    Индекс для "р" должен отличаться от того что для "а" и начинаться с нуля.

  13. 7
    Александр Нестеров ответил:

    …..лана вопрос поставлю так:Как мне запомнить то что выделяет strtokчтобы в дальнейшем работать как со строками?

  14. 6
    Александр Нестеров ответил:

    а как посоветуешь насчет этого a[i]=p-я так и знал что это не правильно хотя мне так посоветовали)….вот мне нужно выделять и заносить эти 3 строки и работать с ними-а как ?

  15. 5
    Жека Кирпичев ответил:

    char s[80],a[3]

    strcat(s1,a[0]);

    А то, что у тебя в массив СИМВОЛОВ заносятся УКАЗАТЕЛИ – это отдельная проблема. Так делать ни в коем случае нельзя.
    Я про a[i]=p;

    При этом, естесственно, указатель обрубается до 8 младших бит, и от его былого могущества остается полная х*йня.

  16. 4
    Александр Нестеров ответил:

    а разве в массив у меня символы заносятся??

  17. 3
    Александр Нестеров ответил:

    у меня заносятся указатели на строку..

  18. 2
    Александр Нестеров ответил:

    это черновой вариант мой дык что там есть лишнее -выводы и тд-это все для проверки делалось

  19. 1
    Жека Кирпичев ответил:

    Посмотри документацию по strcat, и все станет ясно. Ты ее неправильно используешь – она соединяет две строки, а не строку с символом.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.