How do I compare a char entry with an interval (0 to 9) without specifying individual conditions?

5

I'm doing a program that reads a string and I want to ignore the spaces and letters that the user types (but I have to read the letters i and the math symbols + - / * ^). >

What I have achieved so far has been to ignore only the spaces. I thought of instead of ignoring what I do not want, I accept only what I want. So I need to know how to compare with a range.

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

  void main()
  {
    char t[10];
    char r[10];
    fgets(t, 10, stdin);
    int i = 0;
    int c = 0;
    for (i=0; i<10; i++){
        if (t[i] !=' '){
            r[c]=t[i];
            c++;
        }
    }
    printf("%s", r);

}
    
asked by anonymous 10.09.2016 / 16:23

2 answers

4

You can do this:

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

int main() {
    char t[10];
    char r[10];
    fgets(t, 10, stdin);
    int c = 0;
    for (int i = 0; i < 10 && t[i] != 0; i++) {
        if (isdigit(t[i]) || t[i] == 'i' || t[i] == 'p' || t[i] == '+' || 
                t[i] == '-' || t[i] == '*' || t[i] == '/' || t[i] == '^') {
            r[c++] = t[i];
        }
    }
    r[c] = '
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
    char t[10];
    char r[10];
    fgets(t, 10, stdin);
    int c = 0;
    for (int i = 0; i < 10 && t[i] != 0; i++) {
        if (isdigit(t[i]) || t[i] == 'i' || t[i] == 'p' || t[i] == '+' || 
                t[i] == '-' || t[i] == '*' || t[i] == '/' || t[i] == '^') {
            r[c++] = t[i];
        }
    }
    r[c] = '%pre%';
    printf("%s", r);
}
'; printf("%s", r); }

See running on ideone .

I gave a simplified and modernized. Note that checking for loose characters does not have much to do but compare one by one. Of course I could create a solution with an array of valid characters , but I do not think it will pay off in that case, it gets more short but may not be as good at performance.

To check the digits, I prefer to use a ready function ( isdigit() ). You could also compare for a range ( t[i] >= '0' && t[i] <= '9' ) that should be the exact implementation of isdigit() .

I have fixed a problem that prevents the correct operation in some situations which is the lack of finalization of the string that should always end with a null. Also, now the loop will even find a null, after all the string can be less than 10 characters, without that check it would pick up garbage in those cases.

    
10.09.2016 / 17:56
2
#include <stdio.h>  // para printf, fgets
#include <string.h> // para strchr

int main() // tipo de 'main' e' 'int'
{
   // variavel de controle do 'for' que anda no buffer de entrada (lido do teclado)
   int i;

   // variavel de controle do 'for' que anda no buffer de saida (caracteres validos)
   int c;

   // buffer para leitura de linha
   char t[10];

   // buffer de saida, apenas com os caracteres lidos que sao validos
   char r[10];

   // tabela de caracteres validos
   char validChars[] = "01234567890ip+-/*";

   // ponteiro usado como resultado da chamada a 'strchr'
   char* p;

   // leitura de uma linha do teclado
   // no final do buffer vai ter '\n' e '
#include <stdio.h>  // para printf, fgets
#include <string.h> // para strchr

int main() // tipo de 'main' e' 'int'
{
   // variavel de controle do 'for' que anda no buffer de entrada (lido do teclado)
   int i;

   // variavel de controle do 'for' que anda no buffer de saida (caracteres validos)
   int c;

   // buffer para leitura de linha
   char t[10];

   // buffer de saida, apenas com os caracteres lidos que sao validos
   char r[10];

   // tabela de caracteres validos
   char validChars[] = "01234567890ip+-/*";

   // ponteiro usado como resultado da chamada a 'strchr'
   char* p;

   // leitura de uma linha do teclado
   // no final do buffer vai ter '\n' e '%pre%'
   // portanto na verdade vai ter no maximo 8 caracteres validos
   fgets(t, 10, stdin);

   // inicializa os indices dos buffers de entrada 'i' e saida 'c'
   // verifica se cada caracter lido no 'fgets' esta' na tabela 'validChars'
   // para no 0 binario que marca o fim do buffer de entrada
   for (i = 0, c = 0; i < 10 && t[i] != 0; i++)
   {
       // strchr procura o caracter 't[i]' na tabela 'validChars'
       // se o caracter 't]i]' for encontrado, 'p' aponta para o caracter na tabela
       // se o caracter nao for encontrado, 'p' fica valendo NULL
       p = strchr(validChars, t[i]);

       if (p != NULL)
       {
           // ok, caracter e' valido, entao acumula no buffer de saida
           r[c++] = t[i];
       }
   }

   // marca final da string de saida
   r[c] = 0;

   // grava string de saida
   printf("%s", r);

   // nao precisa 'return 0;' porque e' o default
}
' // portanto na verdade vai ter no maximo 8 caracteres validos fgets(t, 10, stdin); // inicializa os indices dos buffers de entrada 'i' e saida 'c' // verifica se cada caracter lido no 'fgets' esta' na tabela 'validChars' // para no 0 binario que marca o fim do buffer de entrada for (i = 0, c = 0; i < 10 && t[i] != 0; i++) { // strchr procura o caracter 't[i]' na tabela 'validChars' // se o caracter 't]i]' for encontrado, 'p' aponta para o caracter na tabela // se o caracter nao for encontrado, 'p' fica valendo NULL p = strchr(validChars, t[i]); if (p != NULL) { // ok, caracter e' valido, entao acumula no buffer de saida r[c++] = t[i]; } } // marca final da string de saida r[c] = 0; // grava string de saida printf("%s", r); // nao precisa 'return 0;' porque e' o default }
    
10.09.2016 / 19:48