kodiak Posted April 3, 2012 at 11:16 AM Report #447209 Posted April 3, 2012 at 11:16 AM 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
pmg Posted April 3, 2012 at 11:28 AM Report #447212 Posted April 3, 2012 at 11:28 AM 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!
kodiak Posted April 3, 2012 at 01:47 PM Author Report #447239 Posted April 3, 2012 at 01:47 PM 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
pmg Posted April 3, 2012 at 02:12 PM Report #447245 Posted April 3, 2012 at 02:12 PM 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!
kodiak Posted April 3, 2012 at 03:31 PM Author Report #447267 Posted April 3, 2012 at 03:31 PM Ok. Obrigado pela explicação kodiak
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now