Как проверить, содержит ли строка только один и ноль? - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь определить, содержит ли строка только символы «0» и «1». Это то, что я до сих пор:

    while (indexCheck < 32) {

        if ((input[indexCheck] != '0') && (input[indexCheck] != '1')) {

            printf("not binary ");
            indexCheck++;

        }  else if ((input[indexCheck] = '0') && (input[indexCheck] = '1')) {
            indexCheck++;
            printf("is binary ");

        } 

    }

Я знаю, почему он возвращает «является двоичным» или «не двоичным» для каждого символа в массиве, но я не знаю, как это исправить. Я хочу, чтобы он возвращал «двоичный» один раз, если строка состоит только из «1» и «0», и наоборот, если это ложно. Я новичок в C, поэтому вся помощь приветствуется.

Ответы [ 6 ]

12 голосов
/ 27 марта 2019

Вместо того, чтобы вручную циклически проходить по строке, вы можете увидеть, содержит ли она только определенные символы, проверив, возвращает ли strspn () длину строки (посмотрев, является ли индекс значением ееВозвращает 0 в конце строки):

_Bool is_binary(const char *s) {
  if (!s || !*s) {
    return 0;
  }
  return s[strspn(s, "01")] == '\0';
}
9 голосов
/ 27 марта 2019

Я бы сделал для этого функцию:

int isBinary(const char *input)
{
    for (int i = 0; input[i]; ++i)
        if (input[i] != '0' && input[i] != '1')
            return 0;
    return 1;
}

Тогда вы можете вызвать функцию:

if (isBinary("0001110110101"))
    printf("is binary\n");
else
    printf("is not binary\n");

https://ideone.com/tKBCbf

2 голосов
/ 27 марта 2019

Вы можете прекратить зацикливание строки, как только найдете символ, который не равен ни «0», ни «1». После завершения цикла вы проверяете, достигли ли вы конца строки, т. Е. Текущий символ является нулевым '\0'

while (*s == '0' || *s == '1') ++s;

if (*s)
    puts("not binary");
else
    puts("binary");
1 голос
/ 27 марта 2019

есть блок кода для вас с комментариями.

#include <stdio.h>
#include <stdlib.h>

#define STRING_SIZE 32 // Better to use #define for reusability

// Function prototype
int isBinary(char * testInput);

// Main program
int main(void)
{
    // Test inputs
    char testInputBinary[33] = "01010101010101010101010101010101";
    char testInputNotBinary[33] = "010101010101010101010101010101ab";

    // Test & collect results
    if (isBinary(testInputBinary))
    {
        printf("Binary ! \n");
    }
    else
    {
        printf("Not binary ! \n");
    }


    if (isBinary(testInputNotBinary))
    {
        printf("Binary ! \n");
    }
    else
    {
        printf("Not binary ! \n");
    }

    return EXIT_SUCCESS;
}

int isBinary(char * testInput)
{
    int loopIdx = 0; // Loop index
    int returnVal = 0; // 0: False, 1: True

    // iterate over string
    for (loopIdx = 0; loopIdx < STRING_SIZE; loopIdx++)
    {
        if(testInput[loopIdx] != '0' && testInput[loopIdx] != '1')
        {
            break;
        }
    }

    // If the loop is not broken, it means all characters are in binary form
    if (loopIdx == STRING_SIZE)
    {
        returnVal = 1;
    } // No need to writing else clause since returnVal = 0 at the beginning

    return returnVal;
}
1 голос
/ 27 марта 2019
    int isBinary = 1;
    while (input[indexCheck] != '\0')
    {
        if (input[indexCheck] != '1' && input[indexCheck] != '0')
        {
            isBinary = 0;
            break;
        }
        ++indexCheck;
    }
    if (isBinary)
    {
        printf("binary");
    }
    else
    {
        printf("not binary");
    }

Проверьте каждый элемент в строке input.Если input[index] не равно 0 или 1, флаг isBinary становится 0 и прерывается while.И вам не нужна длина строки.

1 голос
/ 27 марта 2019

Вы можете сделать:

while (indexCheck < 32) 
{
    if ((input[indexCheck] != '0') && (input[indexCheck] != '1'))
    {
        break;
    }
    else
    {
        indexCheck++;
    } 
}
if (indexCheck == 32)
    printf("is binary ");
else
    printf("is not binary ");

Только когда он обработал все элементы и не встретил ноль, равный 1 или 0, завершает цикл с indexCheck == 32, так что вы можете использовать это, чтобы определить, что печатать.

Обратите внимание, что ваше else условие не требуется.

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