Member 14838257 Ответов: 2

Проблема при запуске моей программы


Привет всем!Я должен запустить программу, которая считывает строку от пользователя и печатает обратную строку, символ с наибольшей частотой и символ с меньшей частотой frequences.So, я сделал две функции, но у меня есть проблема, когда я запускаю свой код.Моя программа печатает строку в обратном порядке и после этого выходит из строя.Можете ли вы помочь мне найти мою ошибку?Например, когда мой вход-hello world, мой выход-dlrow olleh, и после этого моя программа выходит из строя и не появляется результат моей другой функции.

Что я уже пробовал:

Вот мой код,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void chars(char *s, char *most_seen, char *less_seen)
{
    char *s2=malloc((strlen(s)+1)*sizeof(char)); //create a new string 
    int i,j,count=0,count1=1,count2=0,count3=100;
    //gets(s1);
    strcpy(s2,s); //copy the s to s2 to compare the strings

    //compare the strings to find the character which appear more in the string 
    for(i=0;i<strlen(s);i++)
    {
        for(j=0;j<strlen(s);j++)
        {
            if(s[i]==s2[j])
                count2++;
        }
        if(count2>count1)
        {
            count1=count2;
            *most_seen=s[i];
        }
        count2=0;
    }
     //compare the strings to find the character which appear less in the string 
     for(i=0;i<strlen(s);i++)
    {
        for(j=0;j<strlen(s);j++)
        {
            if(s[i]==s2[j])
            {
                count++;
            }
        }
        if(count<count3)
        {
            count3=count;
            *less_seen=s[i];
        }
        count=0;
    }
}

char *reverse(char *s)
{
   int l, i;
    char *begin_ptr, *end_ptr, ch;

    // Get the length of the string
    l = strlen(s);

    begin_ptr = s;
    end_ptr = s;

    for (i = 0; i < l - 1; i++)
        end_ptr++;
    for (i = 0; i < l / 2; i++) {
        ch = *end_ptr;
        *end_ptr = *begin_ptr;
        *begin_ptr = ch;

         begin_ptr++;
         end_ptr--;
    }
}

int main()
{
    char *s=malloc(1000*sizeof(char));
    char *s2;
    char mostSeen,lessSeen;

    fgets(s,1000,stdin);
    s[strcspn(s,"\n")] = '\0';

    chars(s,&mostSeen, &lessSeen);
    s2 = reverse(s);

    printf("%s\n",s);
    printf("%s\n",s2);
    printf("%c\n%c\n",mostSeen,lessSeen);

    return 0;
}

KarstenK

вы пробовали использовать отладчик с его представлением памяти?

2 Ответов

Рейтинг:
16

OriginalGriff

Просто: ваш обратный метод не возвращает значения:

char *reverse(char *s)
{
   int l, i;
    char *begin_ptr, *end_ptr, ch;

    // Get the length of the string
    l = strlen(s);

    begin_ptr = s;
    end_ptr = s;

    for (i = 0; i < l - 1; i++)
        end_ptr++;
    for (i = 0; i < l / 2; i++) {


        ch = *end_ptr;
        *end_ptr = *begin_ptr;
        *begin_ptr = ch;

         begin_ptr++;
         end_ptr--;
    }


    }
Вы на самом деле реверсируете строку inplace - так что вывод вашего see: "dlrow olleh" исходит от вашего первого printf- не твой второй.

Гораздо, гораздо лучшей идеей было бы сделать обратное в новый буфер и вернуть его (используя malloc как и в вашей другой функции), но вы можете просто добавить
return s;
до конца функции.


Рейтинг:
0

Member 14838257

О, вы правы!Большое спасибо!!


OriginalGriff

Всегда пожалуйста!
Не публикуйте комментарии, подобные этому, в качестве решения - используйте "есть вопрос или комментарий?" вместо этого-пуговица. Таким образом, плакат получает электронное письмо - точно такое же, как это, - чтобы сообщить им, что вы с ними разговариваете.

Вы хотите, чтобы я удалил это для вас?