c - 字符串值是从另一个字符串获取值

标签 c arrays string algorithm variables

我在字符串值方面遇到问题,我正在函数 "gerarconta" 上生成该函数,该函数为以下变量生成随机数: “cb->cocom[numcontas].senha”

使用 4 个数字作为字符,"cb->cocom[numcontas].agencia""cb->cocom[numcontas].numconta" 包含 3 个字符。

问题是第一个值保存在其他变量上,例如:

cb->cocom[numcontas].senha = 1213

cb->cocom[numcontas].agencia = 545

cb->cocom[numcontas].numconta = 187545

每次我使用 printf 时都会发生这种情况。

//AEP 30/04/2019
//Algoritmo para um sistema bancário
//Created by Jordão Qualho da silva
//.
//Last Update 16/04/2019 21:37
//------------------------------------------------------------------------------
//Bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <locale.h>
#include <math.h>
#include <conio.h>
//------------------------------------------------------------------------------
int num=0; //numero de pessoas inseridas
int numcontas=0; //numero de contas inseridas
int tipoconta=-1; //-1=inicio 0=comum 1=especial 2=poupanca
//------------------------------------------------------------------------------
void gotoxy(int x, int y){
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD){x-1,y-1});
     //muda o cursor para a posição x,y
   }
//------------------------------------------------------------------------------
void fazerjanela (int ci,int li,int lf,int cf){
  //faz uma janela c=coluna l=linha i=incial f=final
  int i,y;
  for ( i = ci+1; i < cf; i++) {
    gotoxy(i,ci);printf("%c",196 );
  }
  for ( i = ci+1; i < cf; i++) {
    gotoxy(i,lf);printf("%c",196 );
  }
  for ( i = li; i < lf; i++) {
    gotoxy(ci,i);printf("%c",179 );
  }
  for ( i = li; i < lf; i++) {
    gotoxy(cf,i);printf("%c",179 );
  }
  gotoxy(ci,li);printf("%c",218 );
  gotoxy(cf,lf);printf("%c",217 );
  gotoxy(cf,li);printf("%c", 191);
  gotoxy(ci,lf);printf("%c", 192);
  gotoxy(cf,lf+1);printf("\n");
}
//------------------------------------------------------------------------------
typedef struct Pessoa{
  char nome [100];
  char endereco [100];
  char telefone [12];
  float renda;
  int tipopessoa; //1=fisica e 2=Juridica
  char cpf [20],cnpj [20];
}pe;
typedef struct Historico{
  char numconta [10];//verificar depois
  char data [8];
  char tipodoc [20];
  float valor;
}hist;
typedef struct Contacomum{
  char senha [4];
  char numconta [3];
  char agencia [3];
  float saldo;
  hist historicos [100];
  pe pessoas [100];
  int pessoa;
}cc;
typedef struct Contaespecial{
  char senha [50];
  char numconta [10];
  char agencia [10];
  float saldo;
  hist historicos [100];
  pe pessoas [100];
  int pessoa;
  float limite;
}ce;
typedef struct contapoupanca{
  char senha [50];
  char numconta [10];
  char agencia [10];
  float saldo;
  hist historicos [100];
  pe pessoas [100];
  int pessoa;
}cp;
typedef struct contabancaria{
  cp copou [20];
  ce coesp [20];
  cc cocom [20];
}cb;
//------------------------------------------------------------------------------
void gerarconta (cb *cb){
  int i=0;
  //semente para o numero randomico com o tempo do sistema atual
  srand((unsigned)time(NULL));
  FILE *arq;
    arq = fopen("Contas.txt","w");
  if (tipoconta==0) {
    //gerando senha de 4 digitos aleatoria
    for ( i = 0; i < 4; i++) {
      cb->cocom[numcontas].senha[i]=48+(rand()%10);
    }gotoxy (5,5); printf("%s",cb->cocom[numcontas].senha);

    for ( i = 0; i < 3; i++) {
      cb->cocom[numcontas].agencia[i]=48+(rand()%10);
    }gotoxy (5,6); printf("%s",cb->cocom[numcontas].agencia);

    for ( i = 0; i < 3; i++) {
      cb->cocom[numcontas].numconta[i]=48+(rand()%10);
    }gotoxy (5,7); printf("%s",cb->cocom[numcontas].numconta);

    gotoxy (20,5); printf("%s",cb->cocom[numcontas].senha);
    gotoxy (20,6); printf("%s",cb->cocom[numcontas].agencia);
    gotoxy (20,7); printf("%s",cb->cocom[numcontas].numconta);
    getch();

    /*fprintf(arq,"%s %s %s",
    cb->cocom[numcontas].senha,
    cb->cocom[numcontas].agencia,
    cb->cocom[numcontas].numconta);fclose (arq);*/
  }
  if (tipoconta==1) {
    for ( i = 0; i < 4; i++) {
      cb->coesp[numcontas].senha[i]=rand()%10;
    }
    for ( i = 0; i < 3; i++) {
      cb->coesp[numcontas].agencia[i]=rand()%10;
    }
    for ( i = 0; i < 3; i++) {
      cb->coesp[numcontas].numconta[i]=rand()%10;
    }

  }
  if (tipoconta==2) {
    for ( i = 0; i < 4; i++) {
      cb->copou[numcontas].senha[i]=rand()%10;
    }
    for ( i = 0; i < 3; i++) {
      cb->copou[numcontas].agencia[i]=rand()%10;
    }
    for ( i = 0; i < 3; i++) {
      cb->copou[numcontas].numconta[i]=rand()%10;
    }
  }
}
//------------------------------------------------------------------------------
void transformarnome (char *nome){
  int i,tam;
  tam = strlen (nome);
  for (i = 0; i < tam; i++) {
    if (nome [i] == '.') {
      nome[i]=' ';
    }
  }
}
//------------------------------------------------------------------------------
void transformarnomevolta (char *nome){
  int i,tam;
  tam = strlen (nome);
  for (i = 0; i < tam; i++) {
    if (nome [i] == ' ') {
      nome[i]='.';
    }
  }
}
//------------------------------------------------------------------------------
void transformarCPF (char *cpf){
  int i,tam;
  cpf[13]=cpf[10];cpf[12]=cpf[9];cpf[11]='-';
  cpf[10]=cpf[8]; cpf[9]=cpf[7]; cpf[8]=cpf[6];cpf[7]='.';
  cpf[6]=cpf[5];  cpf[5]=cpf[4]; cpf[4]=cpf[3];cpf[3]='.';
}
//------------------------------------------------------------------------------
void criarpessoafisica (cb *cb){
  int tam, flag=0;
  FILE *arq; int i=0;
    arq = fopen("Pessoas.txt","a");
  cb->cocom[numcontas].pessoas[num].tipopessoa = 1;
  system("cls");    fazerjanela(1,1,15,50);
  gotoxy (15,2); printf("Cadastro de Pessoa Fisica");
  gotoxy (3,4); printf("Pesssoa N00%i ", num+1);
  gotoxy (3,6); printf("Nome: ");fflush (stdin);
  scanf("%[^\n]s", &cb->cocom[numcontas].pessoas[num].nome);
  gotoxy (3,7); printf("Endereco: ");fflush (stdin);
  scanf("%[^\n]s", &cb->cocom[numcontas].pessoas[num].endereco );
  gotoxy (3,8); printf("Telefone: ");fflush (stdin);
  scanf("%[^\n]s", &cb->cocom[numcontas].pessoas[num].telefone );
  gotoxy (3,9); printf("Renda Mensal: ");fflush (stdin);
  scanf("%f", &cb->cocom[numcontas].pessoas[num].renda );
  do {
    gotoxy (3,12); printf("                                            ");
    gotoxy (3,14); printf("                                            ");
    gotoxy (3,10); printf("                                     ");
    gotoxy (3,10); printf("CPF: ");fflush (stdin);
    scanf("%[^\n]s", &cb->cocom[numcontas].pessoas[num].cpf );
    tam = strlen (cb->cocom[numcontas].pessoas[num].cpf);
    if (tam != 11) {
      gotoxy (3,12); printf("Error 404: CPF Invalido !");
      gotoxy (3,14); system ("PAUSE");
      flag=1;
    }else{
     flag=0;
    }
  } while(flag);
  gotoxy (3,12); printf("Pessoa cadastrada com sucesso !");
  gotoxy (3,14); system("PAUSE"); system ("cls");
  transformarnomevolta (&cb->cocom[numcontas].pessoas[num].nome);
  transformarnomevolta (&cb->cocom[numcontas].pessoas[num].endereco);
  transformarCPF(&cb->cocom[numcontas].pessoas[num].cpf );
  fprintf(arq,"\n%s %s %s %.1f %s %i",
  cb->cocom[numcontas].pessoas[num].nome,
  cb->cocom[numcontas].pessoas[num].endereco,
  cb->cocom[numcontas].pessoas[num].telefone,
  cb->cocom[numcontas].pessoas[num].renda,
  cb->cocom[numcontas].pessoas[num].cpf,
  cb->cocom[numcontas].pessoas[num].tipopessoa);
  fclose (arq);
}
//------------------------------------------------------------------------------
void criarpessoajuridica (cb *cb) {
  int tam, flag=0;
  FILE *arq; int i=0;
    arq = fopen("Pessoas.txt","a");
  cb->cocom[numcontas].pessoas[num].tipopessoa = 2;
  system("cls");    fazerjanela(1,1,15,50);
  gotoxy (15,2); printf("Cadastro de Pessoa Juridica");
  gotoxy (3,4); printf("Pesssoa N000%i ", num+1);
  gotoxy (3,6); printf("Nome: ");fflush (stdin);
  scanf("%[^\n]s", &cb->cocom[numcontas].pessoas[num].nome);
  gotoxy (3,7); printf("Endereco: ");fflush (stdin);
  scanf("%[^\n]s", &cb->cocom[numcontas].pessoas[num].endereco );
  gotoxy (3,8); printf("Telefone: ");fflush (stdin);
  scanf("%[^\n]s", &cb->cocom[numcontas].pessoas[num].telefone );
  gotoxy (3,9); printf("Renda Mensal: ");fflush (stdin);
  scanf("%f", &cb->cocom[numcontas].pessoas[num].renda );
  gotoxy (3,10);    printf("CNPJ: ");fflush (stdin);
  scanf("%%[^\n]s", &cb->cocom[numcontas].pessoas[num].cnpj );
  gotoxy (3,12); printf("Pessoa cadastrada com sucesso !");
  gotoxy (3,14); system("PAUSE"); system ("cls");
  fprintf(arq,"%s %s %s %f %s",
  cb->cocom[numcontas].pessoas[num].nome,
  cb->cocom[numcontas].pessoas[num].endereco,
  cb->cocom[numcontas].pessoas[num].telefone,
  cb->cocom[numcontas].pessoas[num].renda,
  cb->cocom[numcontas].pessoas[num].cnpj,
  cb->cocom[numcontas].pessoas[num].tipopessoa);
  num++;
}
//------------------------------------------------------------------------------
void cadastrarpessoa (cb *cb){
  int pos1=1;
  char opc;
  do{
      system("cls"); fazerjanela (1,1,15,50);
      gotoxy (6,5);  printf("Que tipo de pessoa deseja cadastrar ?");
      gotoxy (6,8);  printf("   Pessoa Fisica");
      gotoxy (25,8); printf("   Pessoa Juridica");
      gotoxy (40,14);printf("   Voltar");
      switch (pos1){
        case 1: gotoxy(6,8);    printf("-> Pessoa Fisica");break;
        case 2: gotoxy(25,8);   printf("-> Pessoa Juridica");break;
        case 3: gotoxy(40,14);  printf("-> Voltar");break;
      }
       opc=getch();
       if (opc==-32){ //tecla especial necessita pegar segundo valor
          opc=getch();
          switch (opc) {
            case 75:pos1--; break; //SETA PRA CIMA
            case 77:pos1++; break; //SETA PRA BAIXO
          }
       }
     if (pos1==0) pos1=3;
     if (pos1==4) pos1=1;
     if (opc == 13) //ENTER
       switch (pos1){
         case 1:
           criarpessoafisica (&cb);
           opc=27;
         break;
         case 2:
           criarpessoajuridica (&cb);
           opc=27;
         break;
         case 3:
                opc=27;
         break;
       }
   }
   while (opc!=27);
}
//------------------------------------------------------------------------------
void criarcontacomum(cb *cb){
  int pos1=1;
  char opc;
  tipoconta = 0;
  do{
    system ("cls");  fazerjanela(1,1,15,50);
    gotoxy (2,4);   printf("-----------------(Conta Comum)------------------");
    gotoxy (5,7);   printf("   Cadastrar Nova Pessoa ");
    gotoxy (5,9);   printf("   Usar Pessoa Existente ");
    gotoxy (2,12);  printf("------------------------------------------------");
    gotoxy (42,14); printf("   Sair");
    switch (pos1){
      case 1: gotoxy(5,7);  printf("-> Cadastrar Nova Pessoa ");           break;
      case 2: gotoxy(5,9); printf("-> Usar Pessoa Existente ");        break;
      case 3: gotoxy(42,14);printf("-> Sair");                  break;
    }
     opc=getch();
     if (opc==-32){ //tecla especial necessita pegar segundo valor
        opc=getch();
        switch (opc) {
          case 72:pos1--; break; //SETA PRA CIMA
          case 80:pos1++; break; //SETA PRA BAIXO
        }
     }
   if (pos1==0) pos1=3;
   if (pos1==4) pos1=1;
   if (opc == 13) //ENTER
       switch (pos1){
         case 1:
          cadastrarpessoa (&cb);
          gerarconta (&cb);
          num++;  numcontas ++;
         break;
         case 2:

         break;
         case 3:
                opc=27;
         break;
       }
   }
   while (opc!=27);
 }
//------------------------------------------------------------------------------
void criarcontaespecial(cb *cb){

}
//------------------------------------------------------------------------------
void criarcontapoupanca(cb *cb){

}
//------------------------------------------------------------------------------
void criarconta(cb *cb) {
  int pos1=1;
  char opc ;
  do{
      system ("cls");  fazerjanela(1,1,15,50);
      gotoxy (2,4);   printf("--------------------(Conta)---------------------");
      gotoxy (5,6);   printf("   Conta Comum ");
      gotoxy (5,8);   printf("   Conta Especial ");
      gotoxy (5,10);   printf("   Conta Poupanca ");
      gotoxy (2,12);  printf("------------------------------------------------");
      gotoxy (42,14); printf("   Sair");
      switch (pos1){
        case 1: gotoxy(5,6);  printf("-> Conta Comum");           break;
        case 2: gotoxy(5,8);  printf("-> Conta Especial");        break;
        case 3: gotoxy(5,10);  printf("-> Conta Poupanca" );       break;
        case 4: gotoxy(42,14);printf("-> Sair");                  break;
      }
       opc=getch();
       if (opc==-32){ //tecla especial necessita pegar segundo valor
          opc=getch();
          switch (opc) {
            case 72:pos1--; break; //SETA PRA CIMA
            case 80:pos1++; break; //SETA PRA BAIXO
          }
       }
     if (pos1==0) pos1=4;
     if (pos1==5) pos1=1;
     if (opc == 13) //ENTER
       switch (pos1){
         case 1:
          criarcontacomum (&cb);
         break;
         case 2:
          criarcontaespecial (&cb);
         break;
         case 3:
          criarcontapoupanca (&cb);
         case 4:
          opc=27;
         break;
       }
   }
   while (opc!=27);
}
//------------------------------------------------------------------------------
void acessarconta(cb *cb){

}
//------------------------------------------------------------------------------
/*void lerarquivo (cb *cb){
    FILE *arq; int i=0;
    arq = fopen("Pessoas.txt","r");
      system ("cls");
    while ( !feof(arq)) {
      fscanf(arq,"%s" "%s" "%f" "%s",&cb->contacomum[0]->pessoas[i].nome,&cb->contacomum[0]->pessoas[i].endereco,&cb->contacomum[0]->pessoas[i].renda,&cb->contacomum[0]->pessoas[i].cpf);
      transformarnome (&cb->contacomum[0]->pessoas[i].nome);
      transformarnome (&cb->contacomum[0]->pessoas[i].endereco);
      i++;num++;
    }
}*/
//------------------------------------------------------------------------------
/*void procurarpessoa (cb *cb){
  int opcao,i,col=5;
  if (num > 0) {
    system ("cls");
    fazerjanela(1,1,15,50);
    gotoxy (13,2); printf("Pessoas Inseridas: %i", num-1);
    for ( i = 0; i < num; i++) {
      gotoxy (3,(i+4)); printf("%i. %s",(i+1),cb->pessoas[i].nome);
    }
    gotoxy (3,(i+5)); printf("Insira o numero da pessoa que desja editar: " );
    fflush (stdin);scanf("%i", &opcao);
    system ("cls");
    fazerjanela(1,1,12,50);
    opcao=opcao-1;
    gotoxy (16,3);  printf("Pesssoa Fisica N00%i ", opcao+1);
    gotoxy (3,6);   printf("    Nome: %s", cb->pessoas[opcao].nome);
    gotoxy (3,7);   printf("Endereco: %s", cb->pessoas[opcao].endereco );
    gotoxy (3,8);   printf("   Renda: %.1f", cb->pessoas[opcao].renda );
    gotoxy (3,9); printf("     CPF: %s", cb->pessoas[opcao].cpf );
    gotoxy (3,11); system ("PAUSE");
  }
}*/
//------------------------------------------------------------------------------
int main() {
  system("mode con:cols=50 lines=17");
  cb contabancaria;
  int pos1=1;
  char opc;
  //lerarquivo (&contabancaria); //arumar <<<<<<<<<<<<<<<<<<<<<<<<<<<<<------
  do{
      system("cls"); fazerjanela (1,1,15,50);
      gotoxy (2,4);   printf("--------------------(Conta)---------------------");
      gotoxy (5,8);   printf("   Criar ");
      gotoxy (31,8);  printf("   Acessar ");
      gotoxy (2,12);  printf("------------------------------------------------");
      gotoxy (42,14); printf("   Sair");
      switch (pos1){
        case 1: gotoxy(5,8);  printf("-> Criar");       break;
        case 2: gotoxy(31,8); printf("-> Acessar");       break;
        case 3: gotoxy(42,14);printf("-> Sair");           break;
      }
       opc=getch();
       if (opc==-32){ //tecla especial necessita pegar segundo valor
          opc=getch();
          switch (opc) {
            case 75:pos1--; break; //SETA PRA ESQUERDA
            case 77:pos1++; break; //SETA PRA DIREITA
          }
       }
     if (pos1==0) pos1=3;
     if (pos1==4) pos1=1;
     if (opc == 13) //ENTER
       switch (pos1){
         case 1:
          criarconta(&contabancaria);
         break;
         case 2:
          acessarconta(&contabancaria);
         break;
         case 3:
          opc=27;
         break;
       }
   }
   while (opc!=27);
   system("cls");
   printf("\nPrograma Finalizado com suscesso !\n");
}

最佳答案

尝试将 Contacomum 结构的 header 更改为:

typedef struct Contacomum{
  char senha [5];
  char numconta [4];
  char agencia [4];
  ...
}

并在字符串末尾包含 NULL 字符,如下所示:

...
for ( i = 0; i < 3; i++) {
    cb->cocom[numcontas].numconta[i]=48+(rand()%10);
}
cb->cocom[numcontas].numconta[i + 1] = '\0';
...

对于所有三个:senhanumcontaagencia。这将形成一个正确的 NULL 终止字符串。

关于c - 字符串值是从另一个字符串获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55739690/

相关文章:

php - 在 PHP 中填充多维数组

php - 如何将 jquery 数组传递给 laravel Controller

javascript - 在angularjs中为文本字段字符串创建动态对象

c - 分配错误 : incorrect checksum for freed object

c - MPI 超额认购

c++ - crt1.o函数_start中未定义对 'main'错误的引用

c - Algo - 要解析的键值表达式 (C)

python - n 个列表中项目的所有可能组合

python - matplotlib 中的 TeX 渲染、大括号和字符串格式化语法

python - 从Python中的字符串获取if子句