Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

David Rocha

Pegar um numero inteiro no meio de uma string

Recommended Posts

É o seguinte:

 

O programa recebe via argumento (argc e argv) a seguinte instrução:

somar matriz_5_5.dat matrizb_5_5.dat

 

São 2 programas, um que gera a matriz e salva em arquivo binario ".dat" e o outro tem q ler essa matriz

alocando dinamicamente e fazer a operação de soma entre seus valores.

A minha maior e mais urgente duvida no momento é quanto a pegar o numero de linhas e colunas que esta contido

no nome do arquivo (matriz_5_5), ou seja, eu quero pegar o numero 5 que ta no meio dessa string.

O código ta assim:

 

 

void ler(int **matriz, char **argv)
{
  char mat1[550];
  char mat2[550];									    
  int cont=0,tam,l,c;
  FILE *m1, *m2;		
  
  sscanf(argv[2],"%s_%d_%d.dat",mat1,&l,&c);
  sscanf(argv[3],"%s_%d_%d.dat",mat2,&l,&c);
  
  printf("Linhas %d\n", l);
  printf("Colunas %d\n", c);
  
  sprintf("%s.dat", mat1);
  sprintf("%s.dat", mat2);
  printf("Txt1 %s\n", mat1);
  printf("Txt2 %s\n", mat2);
  system("pause");
  

  m1=fopen(mat1, "rb");					// Abre o fluxo para leitura.
  if (m1==NULL)
  {
     printf("\n\n \tArquivo nao encontrado! m1\n\n");
     system("pause");    
     exit(1);                                          // Caso não seja possível sai da função.
  }
  while(fread(m1,sizeof(matriz),1,m1))	               // Transfere os dado enquanto houver dados.
  {
    cont++;						// Incrementa enquanto houver dados.
  }
  
  fclose(m1);
  
  m2=fopen(mat2, "rb");				     // Abre o fluxo para leitura.
  if (m2==NULL)
  {
     printf("\n\n \tArquivo nao encontrado!\n\n");    
     exit(1);                                         // Caso não seja possível sai da função.
  }
  while(fread(m2,sizeof(matriz),1,m2))                // Transfere os dado enquanto houver dados.
  {
    cont++;				              // Incrementa enquanto houver dados.
  }

  fclose(m2); 					      // Fecha o arquivo.
} 

O programa compila mas da erro, ou então não só pega lixo :mellow: :o

 

Obrigado a todos que puderem ajudar...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Breakpoint 1, main (argc=2, argv=0xbffff1a4) at p6.c:6

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

(gdb) s

 

Breakpoint 2, main (argc=Cannot access memory at address 0x0

) at p6.c:7

 

(gdb) l 1

1 #include <stdio.h>

2 #include <stdlib.h>

3 int main(int argc, char *argv[]) {

4 int a,b;

5 char *s = (char *)malloc(10);

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

7 free(s);

8 return 0;

9 }

(gdb) b 6

Breakpoint 1 at 0x80484a7: file p6.c, line 6.

(gdb) b 7

Breakpoint 2 at 0x80484d4: file p6.c, line 7.

(gdb) r mat_5_3.dat

Starting program: /home/isis/src/imasters/a.out mat_5_3.dat

 

Breakpoint 1, main (argc=2, argv=0xbffff1a4) at p6.c:6

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

(gdb) p argv[1]

$1 = 0xbffff3c5 "mat_5_3.dat"

(gdb) s

 

Breakpoint 2, main (argc=2, argv=0xbffff1a4) at p6.c:7

7 free(s);

(gdb) p s

$2 = 0x804b008 "mat_5_3.dat"

(gdb) p a

$3 = -1073745640

(gdb) p b

$4 = 134520820

(gdb)

 

 

Use strtok ou strchr+strspn

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {

char * addr = strchr(argv[1], '_');
const char *numb = "1234567890";

size_t len = strspn(addr+sizeof(char), numb);
char *n1 = (char*)malloc(len+1);
strncpy(n1, addr+sizeof(char), len);
n1[len+1] = '\0';

printf("n1= %s\n", n1);
free(n1);
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Breakpoint 1, main (argc=2, argv=0xbffff1a4) at p6.c:6

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

(gdb) s

 

Breakpoint 2, main (argc=Cannot access memory at address 0x0

) at p6.c:7

 

(gdb) l 1

1 #include <stdio.h>

2 #include <stdlib.h>

3 int main(int argc, char *argv[]) {

4 int a,b;

5 char *s = (char *)malloc(10);

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

7 free(s);

8 return 0;

9 }

(gdb) b 6

Breakpoint 1 at 0x80484a7: file p6.c, line 6.

(gdb) b 7

Breakpoint 2 at 0x80484d4: file p6.c, line 7.

(gdb) r mat_5_3.dat

Starting program: /home/isis/src/imasters/a.out mat_5_3.dat

 

Breakpoint 1, main (argc=2, argv=0xbffff1a4) at p6.c:6

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

(gdb) p argv[1]

$1 = 0xbffff3c5 "mat_5_3.dat"

(gdb) s

 

Breakpoint 2, main (argc=2, argv=0xbffff1a4) at p6.c:7

7 free(s);

(gdb) p s

$2 = 0x804b008 "mat_5_3.dat"

(gdb) p a

$3 = -1073745640

(gdb) p b

$4 = 134520820

(gdb)

 

 

Use strtok ou strchr+strspn

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {

 char * addr = strchr(argv[1], '_');
 const char *numb = "1234567890";

 size_t len = strspn(addr+sizeof(char), numb);
 char *n1 = (char*)malloc(len+1);
 strncpy(n1, addr+sizeof(char), len);
 n1[len+1] = '\0';

 printf("n1= %s\n", n1);
 free(n1);
 return 0;
}

Não entendi o que é pra fazer... http://forum.imasters.com.br/public/style_emoticons/default/excl.gif

Eu quero pegar um numero Inteiro que está no meio de string, só isso.

 

É essa parte do código a minha dificuldade... :(

 

  char mat1[550];
  char mat2[550];									    // Ponteiro para o fluxo do arquivo.
  int cont=0,tam,l,c;
  FILE *m1, *m2;		
  
  sscanf(argv[2],"%s_%d_%d.dat",mat1,&l,&c);
  sscanf(argv[3],"%s_%d_%d.dat",mat2,&l,&c);
  
  printf("Linhas %d\n", l);
  printf("Colunas %d\n", c);

Vlww...

Compartilhar este post


Link para o post
Compartilhar em outros sites
Não entendi o que é pra fazer... excl.gif

Eu quero pegar um numero Inteiro que está no meio de string, só isso

 

Copiou o código num programa separado e executou?

 

Se você olhar o quote que eu dei no gdb, vai notar que o %s pega o texto inteiro que você fornecer pro sscanf.

 

Pesquisando na Internet você encontra os manuais das funções...

 

http://www.opengroup...ons/strchr.html

http://www.opengroup...ons/strspn.html

http://opengroup.org...sh/strncpy.html

http://www.opengroup...ons/strtok.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Breakpoint 1, main (argc=2, argv=0xbffff1a4) at p6.c:6

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

(gdb) s

 

Breakpoint 2, main (argc=Cannot access memory at address 0x0

) at p6.c:7

 

(gdb) l 1

1 #include <stdio.h>

2 #include <stdlib.h>

3 int main(int argc, char *argv[]) {

4 int a,b;

5 char *s = (char *)malloc(10);

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

7 free(s);

8 return 0;

9 }

(gdb) b 6

Breakpoint 1 at 0x80484a7: file p6.c, line 6.

(gdb) b 7

Breakpoint 2 at 0x80484d4: file p6.c, line 7.

(gdb) r mat_5_3.dat

Starting program: /home/isis/src/imasters/a.out mat_5_3.dat

 

Breakpoint 1, main (argc=2, argv=0xbffff1a4) at p6.c:6

6 sscanf(argv[1],"%s_%d_%d.dat",s,&a,&B);

(gdb) p argv[1]

$1 = 0xbffff3c5 "mat_5_3.dat"

(gdb) s

 

Breakpoint 2, main (argc=2, argv=0xbffff1a4) at p6.c:7

7 free(s);

(gdb) p s

$2 = 0x804b008 "mat_5_3.dat"

(gdb) p a

$3 = -1073745640

(gdb) p b

$4 = 134520820

(gdb)

 

 

Use strtok ou strchr+strspn

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {

 char * addr = strchr(argv[1], '_');
 const char *numb = "1234567890";

 size_t len = strspn(addr+sizeof(char), numb);
 char *n1 = (char*)malloc(len+1);
 strncpy(n1, addr+sizeof(char), len);
 n1[len+1] = '\0';

 printf("n1= %s\n", n1);
 free(n1);
 return 0;
}

Não entendi o que é pra fazer... http://forum.imasters.com.br/public/style_emoticons/default/excl.gif

Eu quero pegar um numero Inteiro que está no meio de string, só isso.

 

É essa parte do código a minha dificuldade... :(

 

  char mat1[550];
  char mat2[550];									    // Ponteiro para o fluxo do arquivo.
  int cont=0,tam,l,c;
  FILE *m1, *m2;		
  
  sscanf(argv[2],"%s_%d_%d.dat",mat1,&l,&c);
  sscanf(argv[3],"%s_%d_%d.dat",mat2,&l,&c);
  
  printf("Linhas %d\n", l);
  printf("Colunas %d\n", c);

Vlww...

 

então voce quer converter um char em um inteiro ?

faça uma coisa +- assim: int x = (string['no na posicao desejada']-48);

isso vai armazenar o inteiro desejado que esta na posição do ventor[]

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.