Jump to content
skinie18

Limitar string a 10 caracteres

Recommended Posts

skinie18

char username[10];

Como faço o scanf da variável limitanto apenas o user inserir 10 caracteres?  :wallbash:

Porque se inserir 11 o programa dá erro de memoria, "Segmentation fault"

Exemplo de execução:

nome: asdasdasdasdasdasdasdasdasd

erro, deve inserir apenas 10 caracteres

nome:

Share this post


Link to post
Share on other sites
MykeX

sim isso resolve o erro de memória mas gostava que tipo o user inseria 13 caracteres e ele dizia: só pode inserir 10 tente de novo!

Tens de usar uma string maior então, ou alocação dinâmica. Declaras por exemplo um vector com 100 caracteres e depois verificas o tamanho.

Share this post


Link to post
Share on other sites
skinie18

Isso não é boa politica de programação! Não vou alocar 100 espaços de memoria quando só quero receber 10 caracteres. 🤔

Eu estava a pensar no seguinte algoritmo:

- Se eu quero receber apenas 10 caracteres faço um vector com 12 posições.

- Faço o

scanf("%11s, username);

- Depois faço um if tipo:

if ( username[12] == '\0')  printf("erro,.....");

Não sei se consegui passar a minha ideia mas assim sempre que passava de 10 posições ele dava uma mensagem de erro e ao mesmo tempo não dava segmentation foult. Mas tentei fazer isso em codigo c e nao funcionou! Dava sempre "erro, ...."

Share this post


Link to post
Share on other sites
MykeX

Então usa:

char username[11];

scanf(" %11s", username);
if(username[10]!='\0')
        printf("Erro !");

Share this post


Link to post
Share on other sites
daj

Nota que o tamanho do array deve ter pelo menos mais um byte que o length indicado no scanf, para o terminador:

Matches a sequence of bytes that are not white-space characters. If the 'm' assignment-allocation character is not specified, the application shall ensure that the corresponding argument is a pointer to the initial byte of an array of char, signed char, or unsigned char large enough to accept the sequence and a terminating null character code, which shall be added automatically.

De resto, porque não algo como o seguinte?

char str[11], ch;
int n;

do {
	scanf("%10s", str);
	for (n = 0; (ch = getchar()) != '\n' && ch != EOF; ++n);
	if (n) printf("Inseriu mais de 10 caracteres\n");
} while (n);

printf("Inseriu: %s\n", str);

Share this post


Link to post
Share on other sites
xtrm0

Uma forma ainda melhor é utilizares um compilador que suporte c++ e a classe string, que no fundo é uma array de chars melhorada.


<Signature goes here>

Share this post


Link to post
Share on other sites
bubulindo

Para implementares o que pretendes, o melhor será desceres de nível em vez de subires para C++, até porque pelos vistos não podes usá-lo. :P

Se o scanf não resulta, podes sempre tentar o getchar() * 10.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
brunoais

Porque não usar o strlen()?

Se tem que ser 10 pode-se fazer dessa maneira.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
daj

skinie18,

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

int main() {
  char username[12];

  while (1) {
    printf("username: ");
    scanf("%11s", username);
    if (strlen(username) > 10)
      printf("LETRAS A MAIS\n");
    else
      break;
  }

  printf("username is %s\n", username);

  return 0;
}

Execução:

username: 123456789012345
LETRAS A MAIS
username: username is 2345

O código que estás a fazer é semelhante ao apresentado e é este o comportamento que pretendes?

Share this post


Link to post
Share on other sites
skinie18

O importante era mesmo eu compreender como me ver livre do segmentation foult e como contar os caracteres que foram inseridos porque o trabalho que estou a desenvolver não é só isto que apresentei, no trabalho recebo um nome de utilizador e uma password e guardo ambas num ficheiro. O problema e que sei que quem vai user/testar o código vai ser o mais agressivo com ele possível por isso tenho que prevenir que o programa de algum erro inesperado ao utilizador!

De qualquer das maneiras tudo que vi aqui me ajudou a criar o que realmente precisava!

Obrigado!

Nota: Sim o seu código foi muito útil. obrigado.

Share this post


Link to post
Share on other sites
Localhost

Lol? E a função fgets serve para quê?

#define MAX 1024

char lol[MAX];

fgets (lol, MAX, stdin);

Easy, no?  :P


here since 2009

Share this post


Link to post
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

×
×
  • 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.