С-функция персонажа, неправильное представление о его поведении - PullRequest
0 голосов
/ 16 октября 2018

В упражнении предлагается написать функцию, которая:

  • читает последовательность буквенных символов (без запоминания последовательности), которая заканчивается только тогда, когда пользователь вводит '\ n'.

  • возвращает 1, если количество заглавных букв превысило нижние, не более чем целое число m, введенное пользователем, или 0 иначе.

Я попытался с помощью следующего кода:

#include<stdio.h>

int read(int p,char c)
{
    int M=0,m=0,d;
    char A,Z,a,z;

    while(c != '\n')
    {
        if(A<=c<=Z)
        {
            M++;
        }
        else if(a<=c<=z)
        {
            m++;
        }
        scanf("%c",&c);
    }

    if(M-m>0)
        d=(m-M);
    else 
        d=0;

    if(d==0)
        return 0;
    else if (d<=p)
        return 1;
}

int main()
{
    int a,h;
    char k;

    scanf("%d", &h);
    scanf("%c", &k);
    a=read(h,k);
    printf("%d\n",a);
    return 0;
}

В этот момент, пытаясь выполнить программу с помощью команды gcc, я заметил, что программа принимает только целое число, скажем, 2, и вернул 0как если бы он вошел в функцию без второго сканирования символа.

Помимо формального заблуждения и ошибок в программе и функции c, которые я рад, что вы исправили,

Я былпытаюсь понять, потому что, как говорится, я пытаюсь быть самоучкой, как scanf функция и функция работают в целом, когда и кому отдан приоритет.

Например, в функции readего мне неясно, когда значение, которое я возвращаю функции, принимается выше, если, как я сделал.

1 Ответ

0 голосов
/ 16 октября 2018

Это не будет делать то, что вы, вероятно, ожидаете

if(A<=c<=Z)

... по разным причинам.Во-первых, значения A и Z неинициализированы.Во-вторых, логика написана для чтения математиком, а не компилятором C.

Вы почти наверняка хотели это:

if('A'<=c && c<='Z')

... и удалите четыре переменные char A,Z,a,z;

Обратите внимание, что использование символьных констант, таких как 'A' и 'Z', предполагает среду выполнения с использованием наборов символов ASCII.Если вы заинтересованы в более портативном решении, вы можете посмотреть isupper() и islower()

...