Даже после увеличения значения переменной оно не изменится в цикле while - PullRequest
0 голосов
/ 02 января 2019
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
    int main()
    {
    char s[] = "We promptly judged antique ivory buckles for the next prize";

    for(int i=0;i<strlen(s);i++)
    {
        s[i] = tolower(s[i]);
    }
    int i=0;
    int n=1;
    int counter =0;
    char *s1;
    s1=(char*)malloc(sizeof(char)*n);
    s1[0] = s[0];

    int k=0;
    while(s[i]!='\0')
    {

            for( k=0;k<strlen(s1);++k)
            {
                if(s[i] == s1[k] && s[i] !=' ')
                ++counter;


            }
            if(counter==0 && s[i]!=' ' )
            {
                ++n;

              s1 = realloc(s1, sizeof(char) * (n));
              ++k;
              printf("%d :  %d\n",n,k);
              s1[k] = s[i];
            }


        ++i;
        counter =0;
        k=0;
    }
    s1 =realloc(s1 , sizeof(char)*(n+1));
    s1[n] = '\0';
    printf("%s\n",s1);

    if(n == 26)
    printf("yes");
    else
    printf("No");

    return 0;
}

Эта программа пытается проверить, является ли слово панграммой или нет .. Он берет букву из массива s и сохраняет ее в массиве s1, если буква не повторяется в последнем. Таким образом, если длина массива s1 после окончания цикла while равна 26, он имеет все возможные буквы. Но когда я попытался распечатать массив s1, он показывает, что только w имеет его содержимое .. Запутался до крайности ...

1 Ответ

0 голосов
/ 02 января 2019

Ваш ++k (внутри оператора if) не нужен, удалите его, и он будет работать:

    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<ctype.h>
    int main()
    {
    char s[] = "We promptly judged antique ivory buckles for the next prize";

    for(int i=0;i<strlen(s);i++)
    {
        s[i] = tolower(s[i]);
    }
    int i=0;
    int n=2;
    int counter =0;
    char *s1;
    s1=(char*)malloc(sizeof(char)*n);
    s1[0] = s[0];
    s1[1]='\0';

    int k=0;
    while(s[i]!='\0')
    {

            for( k=0;k<strlen(s1);++k)
            {
                if(s[i] == s1[k] && s[i] !=' ')
                    ++counter;

            }

            if(counter==0 && s[i]!=' ' )
            {
                ++n;

              s1 = realloc(s1, sizeof(char) * (n));
              /* ++k; */  /* <== REMOVE IT */
              printf("%d :  %d\n",n,k);
              s1[k] = s[i];
              s1[k+1]='\0';
            }


        ++i;
        counter =0;
        k=0;
    }
    s1 =realloc(s1 , sizeof(char)*(n+1));
    s1[n] = '\0';
    printf("%s\n",s1);

    if(n == 26)
    printf("yes");
    else
    printf("No");

    return 0;
}

k уже был увеличен в конце оператора for, поэтому позднее ++k является причиной неверного результата. Также s1 должно быть инициализировано как NULL прекращено, а NULL должно быть завершено внутри оператора if, так как без него s1 может содержать мусор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...