Jump to content

Ler dígitos de string


kodiak
 Share

Recommended Posts

Viva pessoal.

Estou aqui a tentar uma coisa com ponteiros e usando a concatenação de strings e não estou a dar com o erro.

É pedida uma string ao utilizador e o output deve devolver os dígitos encontrados nessa string.

Se o for inserido

a1b2c3d

o output deve ser

123

Aqui o intuito é usar ponteiros e a função strcat.

Fiz o seguinte código:

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

    #define SIZE 10

int main()
    {

        char palavra[size]="";
        char palavra2[size]="";
        char c2[1] = "";
        char *pont = palavra;

        printf("Insere a palavra\n");
        scanf("%s", palavra);

        if (strlen(palavra)>SIZE){
            palavra[size] = '\0';
        }

        do{
            if (isdigit(*pont)){
              c2[0] = *pont;
              strcat(palavra2, c2);
            }
            pont++;
        }while (*pont != '\0');

        printf("\nO numero e:\n%s\n", palavra2);
        return 0;
    }

Neste momento o código funciona quando o utilizador insere uma string com tamanho menor ou igual ao valor definido em

#define SIZE 10

Se for inserida uma string maior, o programa crasha. Pelo que percebi o problema está no ciclo. Assim sendo, adicionei a parte do

        if (strlen(palavra)>SIZE){
            palavra[size] = '\0';
        }

para garantir que mesmo que o utilizador insira uma string maior do que dez, essa string seja modificada para ficar apenas com tamanho dez.

O

while (*pont != '\0');

não deveria parar o código? O que estou a fazer mal?

obrigado,

kodiak

Link to comment
Share on other sites

char palavra[10];
scanf("%s", palavra);

Nota que o array palavra só tem espaço para 9 caracteres mais o terminador '\0'.

O scanf() vai ler sem respeitar esse limite, e, possivelmente, vai querer escrever fora do array.

Sugestão: limita logo à nascença, o número de caracteres que o scanf() aceita

scanf("%9s", palavra);

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Nota que o array palavra só tem espaço para 9 caracteres mais o terminador '\0'.

O scanf() vai ler sem respeitar esse limite, e, possivelmente, vai querer escrever fora do array.

Sugestão: limita logo à nascença, o número de caracteres que o scanf() aceita

scanf("%9s", palavra);

OK pmg. Obrigado pela explicação.

Duas questões.

1ª - Quando eu fazia

        if (strlen(palavra)>SIZE){
            palavra[size] = '\0';
        }

já não estava a garantir que o terminador ela colocado e que a string nunca teria mais do que 9 caracteres?

2ª - Se fizer char c2[2] = ""; o código funciona mas se fizer char c2[1] = ""; já não. A questão é a mesma, isto é, com char c2[1] = ""; não há terminador?

obrigado,

kodiak

Link to comment
Share on other sites

Quando eu fazia

        if (strlen(palavra)>SIZE){
            palavra[size] = '\0';
        }

já não estava a garantir que o terminador ela colocado e que a string nunca teria mais do que 9 caracteres?

Não. Tirando o erro de que palavra "não existe", estavas a garantir que daí para a frente a string não teria mais do que SIZE caracteres (sem contar com o erro de não contar o '\0'). Mas não garantias nada antes do if ... e o código anterior já estava mal.

Se fizer char c2[2] = ""; o código funciona mas se fizer char c2[1] = ""; já não. A questão é a mesma, isto é, com char c2[1] = ""; não há terminador?

c2[1] tem espaço para um caracter. Se queres tratar c1 como string esse caracter tem de ser o '\0'; ou seja, ficas sem espaço para o que quer que seja. Uma string definida com espaço para um caracter só pode ser a string vazia.

c2[2] tem espaço para dois caracteres (nomeadamente o c2[0] e o c2[1]). Para ser uma string um desses caracteres tem de ser o '\0'. Neste caso podes ter strings com tamanho 1.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.