Can't input new order - c

Okay, hopefully after this, I won't ask anymore questions here. I redid the entire code, replacing gets() with scanf(). Now though, whenever I choose to put a new order for the program, I just put the name and the process just ends, showing "return value 3221225477", preventing me from typing in the address, request and price. I screwed up somewhere, but I don't know what. Here's what I did:
Translation:
Case 1: Type name, address, order, total price.
Case 2: Search for code (Issue: new string overwrites old one constantly)
Case 3: Show list of all orders created.
Case 4: Exit
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define TAM 100
struct order
{
char nome[50];
char endereco[150];
char pedido[300];
char valor[10];
};
int main()
{
struct order lista[TAM];
int busca, acha, i, menu;
menu = 0;
int codigo = 0;
int c = 0;
while(menu != 4)
{
system("cls");
printf("====================\n");
printf("Selecione uma opcao\n");
printf("====================\n");
printf("1 - Cadastrar pedido\n");
printf("2 - Consultar pedido\n");
printf("3 - Emitir relatorio\n");
printf("4 - Sair\n");
scanf("%d", &menu);
fflush(stdin);
switch(menu)
{
case 1:
system("cls");
printf("Digite seu nome: \n");
scanf("%49[^\n]", lista[i].nome);
fflush(stdin);
printf("Digite seu endereco: \n");
scanf("%149[^\n]", lista[i].endereco);
fflush(stdin);
printf("Digite seu pedido: \n");
scanf("%299[^\n]", lista[i].pedido);
fflush(stdin);
printf("Digite o valor total: \n");
scanf("%9[^\n]", lista[i].valor);
fflush(stdin);
system("cls");
printf("Codigo: %d\n", codigo);
printf("Nome: %s\n", lista[i].nome);
printf("Endereco: %s\n", lista[i].endereco);
printf("Pedido: %s\n", lista[i].pedido);
printf("Valor total: %s\n", lista[i].valor);
system("pause");
i = i + 1;
codigo = codigo + 1;
break;
case 2:
system("cls");
printf("Insira o codigo que deseja buscar:\n");
scanf("%d", &busca);
fflush(stdin);
i = 0;
acha = 0;
while(i < TAM && acha == 0)
{
if(codigo == busca)
{
acha = 1;
}
else
{
i = i + 1;
codigo = codigo + 1;
}
if(acha == 1)
{
printf("=============================\n");
printf("Codigo: %d\n", codigo);
printf("Nome: %s\n", lista[i].nome);
printf("Endereco: %s\n", lista[i].endereco);
printf("Pedido: %s\n", lista[i].pedido);
printf("Valor total: %s\n", lista[i].valor);
printf("=============================\n");
system("pause");
}
else
{
printf("\n Codigo nao encontrado\n");
system("pause");
break;
}
}
break;
case 3:
system("cls");
c = 0;
for(i = 0; i < TAM; i++){
printf("=============================\n");
printf("Codigo: %d\n", c);
printf("Nome: %s\n", lista[i].nome);
printf("Endereco: %s\n", lista[i].endereco);
printf("Pedido: %s\n", lista[i].pedido);
printf("Valor total: %s\n", lista[i].valor);
printf("=============================\n");
c = c + 1;
}
system("pause");
break;
case 4:
return 0;
default:
printf("Opcao invalido\n");
system("pause");
}
}
return 0;
}

well the immediate cause is this
int busca, acha, i, menu; <<<<=== declare i , but not set to a value
....
scanf("%49[^\n]", lista[i].nome); <<<==== use i
you must set i to zero
int i = 0;

Related

(C Language) Only show filled entries in list

I hope this will be the last time I ask something here. Everything in my Food Ordering Algorithm is finished, but showing the list of filled orders shows every slot available (0 to 100), rather than just the entries filled out. Any way to fix that?
Case 3: Shows all orders made. (But I want just the entries that are filled out, not the empty ones.)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define TAM 100
typedef struct order
{
char nome[50];
char endereco[150];
char pedido[300];
char valor[10];
};
int main()
{
struct order lista[TAM];
int busca, acha, i, menu;
i = 0;
menu = 0;
int codigo = 0;
int c = 0;
while(menu != 4)
{
system("cls");
printf("====================\n");
printf("Selecione uma opcao\n");
printf("====================\n");
printf("1 - Cadastrar pedido\n");
printf("2 - Consultar pedido\n");
printf("3 - Emitir relatorio\n");
printf("4 - Sair\n");
scanf("%d", &menu);
fflush(stdin);
switch(menu)
{
case 1:
system("cls");
printf("Digite seu nome: \n");
scanf("%49[^\n]", lista[i].nome);
fflush(stdin);
printf("Digite seu endereco: \n");
scanf("%149[^\n]", lista[i].endereco);
fflush(stdin);
printf("Digite seu pedido: \n");
scanf("%299[^\n]", lista[i].pedido);
fflush(stdin);
printf("Digite o valor total: \n");
scanf("%9[^\n]", lista[i].valor);
fflush(stdin);
system("cls");
printf("Codigo: %d\n", codigo);
printf("Nome: %s\n", lista[i].nome);
printf("Endereco: %s\n", lista[i].endereco);
printf("Pedido: %s\n", lista[i].pedido);
printf("Valor total: %s\n", lista[i].valor);
system("pause");
i = i + 1;
codigo = codigo + 1;
break;
case 2:
system("cls");
printf("Insira o codigo que deseja buscar:\n");
scanf("%d", &busca);
fflush(stdin);
if(busca < codigo)
{
printf("=============================\n");
printf("Codigo: %d\n", busca);
printf("Nome: %s\n", lista[busca].nome);
printf("Endereco: %s\n", lista[busca].endereco);
printf("Pedido: %s\n", lista[busca].pedido);
printf("Valor total: %s\n", lista[busca].valor);
printf("=============================\n");
system("pause");
}
else
{
printf("\n Codigo nao encontrado\n");
system("pause");
break;
}
break;
case 3:
system("cls");
c = 0;
for(i = 0; i < TAM; i++){
printf("=============================\n");
printf("Codigo: %d\n", c);
printf("Nome: %s\n", lista[i].nome);
printf("Endereco: %s\n", lista[i].endereco);
printf("Pedido: %s\n", lista[i].pedido);
printf("Valor total: %s\n", lista[i].valor);
printf("=============================\n");
c = c + 1;
}
system("pause");
break;
case 4:
return 0;
default:
printf("Opcao invalido\n");
system("pause");
}
}
return 0;
}
change
for(i = 0; i < TAM; i++){
to
for(i = 0; i < codigo ; i++){
codigo is the count og entrries, TAM is the max number of entries

User input not being passed to function

I am working on a college project and we're supposed to write a basic CRUD program in C. In case 1 of my switch, "cpfinput" is passed fine to my function inserir_servidor, but "nominput" (name) is not. I tried debugging it and nominput does actually contain the user input, but when I print my "nomes" array after calling the function, it's empty.
Please forgive me if this is a poorly written post, I am new to SO.
How to reproduce:
1 - Type 1 and press enter.
2 - Enter anything.
3 - Enter anything.
4 - Type 5, it should display "0, a blank, and whatever your inserted in step 3.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TAM 100
char codigos[TAM][9];
char nomes[TAM][255];
char cpfs[TAM][11];
int ocupados[TAM];
int inserir_servidor(char[], char[]);
int alterar_servidor(char[], char[], char[]);
int excluir_servidor(char[]);
int mostrar_servidor(char[]);
int mostrar_servidores();
void inic_ocupados();
int main()
{
char codinput[9], nominput[255], cpfinput[11];
int input = -1;
inic_ocupados();
do
{
printf("1. Inserir um servidor.\n");
printf("2. Alterar um servidor.\n");
printf("3. Excluir um servidor.\n");
printf("4. Mostrar um servidor.\n");
printf("5. Mostrar todos os servidores.\n");
printf("0. Sair do programa.\n");
printf("Escolha: ");
scanf("%d", &input);
switch(input)
{
case 0:
printf("Encerrando...");
return 0;
case 1: //inserir
printf("Insira o nome do servidor: ");
scanf(" %s", nominput);
printf("Insira o cpf do servidor: ");
scanf(" %s", cpfinput);
inserir_servidor(nominput, cpfinput);
break;
case 2: //alterar
printf("Insira o codigo do servidor: ");
scanf(" %s", codinput);
printf("Insira um novo nome: ");
scanf(" %s", nominput);
printf("Insira um novo cpf: ");
scanf(" %s", cpfinput);
alterar_servidor(codinput, nominput, cpfinput);
break;
case 3: //excluir
printf("Digite o codigo do servidor a ser excluido: ");
scanf(" %s", codinput);
excluir_servidor(codinput);
break;
case 4: //listar um
printf("Digite o codigo do servidor a ser mostrado: ");
scanf(" %s", codinput);
mostrar_servidor(codinput);
break;
case 5: //listar todos
mostrar_servidores();
break;
default:
printf("Escolha invalida.\n");
break;
}
} while(input);
return 0;
}
int inserir_servidor(char nominput[], char cpfinput[])
{
for(int i = 0; i < TAM; i++)
{
if (!ocupados[i])
{
itoa(i, codigos[i], 10);
strcpy(nomes[i], nominput);
strcpy(cpfs[i], cpfinput);
ocupados[i] = 1;
return 1;
}
}
return 0;
}
int alterar_servidor(char codinput[], char nominput[], char cpfinput[])
{
for(int i = 0; i < TAM; i++)
{
if(!strcmp(codigos[i], codinput))
{
strcpy(nomes[i], nominput);
strcpy(cpfs[i], cpfinput);
return 1;
}
}
return 0;
}
int excluir_servidor(char codinput[])
{
for(int i = 0; i < TAM; i++)
{
if(!strcmp(codigos[i], codinput))
{
ocupados[i] = 0;
return 1;
}
}
return 0;
}
int mostrar_servidor(char codinput[])
{
for(int i = 0; i < TAM; i++)
{
if(!ocupados[i])
{
if(!strcmp(codigos[i], codinput))
{
printf("Codigo \t Nome \t CPF\n");
printf("%s \t %s \t %s\n", codigos[i], nomes[i], cpfs[i]);
return 1;
}
}
}
return 0;
}
int mostrar_servidores()
{
for(int i = 0; i < TAM; i++)
{
if(ocupados[i])
{
printf("Codigo \t Nome \t CPF\n");
printf("%s \t %s \t %s\n", codigos[i], nomes[i], cpfs[i]);
}
}
return 0;
}
void inic_ocupados()
{
for(int i = 0; i < TAM; i++)
{
ocupados[i] = 0;
}
}
I cannot find the error you report.
1. Inserir um servidor.
2. Alterar um servidor.
3. Excluir um servidor.
4. Mostrar um servidor.
5. Mostrar todos os servidores.
0. Sair do programa.
Escolha: 1
Insira o nome do servidor: aaaaa
Insira o cpf do servidor: bbbbb
1. Inserir um servidor.
2. Alterar um servidor.
3. Excluir um servidor.
4. Mostrar um servidor.
5. Mostrar todos os servidores.
0. Sair do programa.
Escolha: 5
Codigo Nome CPF
0 aaaaa bbbbb
1. Inserir um servidor.
2. Alterar um servidor.
3. Excluir um servidor.
4. Mostrar um servidor.
5. Mostrar todos os servidores.
0. Sair do programa.
Escolha:
There are multiple errors in the code.
First scanf(" %s",... looks for space delimted input so if I enter this
Escolha: 1
Insira o nome do servidor: mr smith <<<<<=========
Insira o cpf do servidor: 1. Inserir um servidor.
2. Alterar um servidor.
3. Excluir um servidor.
4. Mostrar um servidor.
5. Mostrar todos os servidores.
0. Sair do programa.
Escolha:
The 'mr' is taken as 'nom' and 'smith' is taken as 'cpf'
Also this function
int mostrar_servidor(char codinput[])
{
for (int i = 0; i < TAM; i++)
{
if (!ocupados[i])
{
if (!strcmp(codigos[i], codinput))
{
printf("Codigo \t Nome \t CPF\n");
printf("%s \t %s \t %s\n", codigos[i], nomes[i], cpfs[i]);
return 1;
}
}
}
return 0;
}
Is broken.
It only looks at unoccupied cells
if (!ocupados[i])
should be
if (ocupados[i])

main doesn't consider a for-loop

I can't get out of this:
In the following code, if I choose option 1, I let the code begin asking the input described on 1/* InserimentoNaviP1 */; but when the program runs, without error in compiling, the function main() avoids it; the first printf is
("P1: inserisci la riga dove fare fuoco: ");
Can you please help me?
Below a part of the code (I cannot insert it all)
main() {
scanf("%d", &a);
switch (a) {
case 1:
printf("Che vinca il migliore!! \n");
break;
return 0; // Unreachable code...
}
Sleep(1000);
InizializzaGrigliaP1();
InizializzaGrigliaP2();
/* InserimentoNaviP1 */
for (r = 0; r < righe; r++) {
for (c = 0; c < colonne; c++) {
printf("Inserisci riga %d e colonna %d: ", r, c);
scanf("%d", &grigliaP1[r][c]);
}
if (grigliaP1[r][c] == 1) {
printf("nave inserita!\n");
contnum_naviP1++;
printf("restano da inserire %d navi!\n", P1_num_navi - contnum_naviP1);
}
}
for (t = 0;; t++) {
//SparaP1
{
printf("P1: inserisci la riga dove fare fuoco: ");
system("pause");
}
} // added
} // added

I cannot pass the value from the file to the struct

I'm a beginner in C, I'm trying to read a file in order to update a struct but every time I do it it gives me an error (I'm working with visual studio 2013).
This is my code so far:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Registro{
int cedula;
char nombre[20];
char apellido[20];
char direccion[50];
int ingreso;
};
void agregarP(struct Registro * informacion, int * n){
int op,i,aux;
printf("Cuantas personas desea agregar?\n");
fflush(stdin);
scanf_s("%i", &op);
aux = op;
op += *n;
for (i = *n; i < op; i++){
printf("Introduzca la cedula\n");
scanf_s("%i", &informacion[i].cedula);
printf("Introduzca el nombre\n");
fflush(stdin);
gets_s(informacion[i].nombre);
printf("Introduzca el apellido\n");
gets_s(informacion[i].apellido);
printf("Introduzca la direccion\n");
gets_s(informacion[i].direccion);
printf("Introduzca el ingrso anual\n");
scanf_s("%i", &informacion[i].ingreso);
system("cls");
}
*n += aux;
}
bool comprobacion(int n1, int n2){
if (n1 == n2){
return true;
}
else {
return false;
}
}
void borrar(struct Registro * s, int *n){
int i, ced;
struct Registro aux;
bool compr;
printf("Introduzca la cedula de la persona que desea borrar\n");
fflush(stdin);
scanf_s("%i",&ced);
for (i = 0; i < *n; i++){
if (s[i].cedula == ced){
compr = comprobacion(*n, i);
if (compr){
break;
}
else{
aux = s[*n - 1];
s[*n - 1] = s[i];
s[i] = aux;
break;
}
}
}
*n -= 1;
}
void mostrar(struct Registro * informacion, int n){
int i;
printf("Cedula \t Nombre \t Apellido \t Direccion \t Ingreso \n");
for (i = 0; i < n; i++){
printf("%i \t ", informacion[i].cedula);
printf("%s \t ", informacion[i].nombre);
printf("%s \t ", informacion[i].apellido);
printf("%s \t ", informacion[i].direccion);
printf("%i \n", informacion[i].ingreso);
}
}
void mostrarPorOrden(struct Registro * s, int n){
int i, j,cont = 0, op;
struct Registro aux;
printf("1 para mostrar por orden de cedula\n");
printf("2 para mostrar por orden de apellido\n");
fflush(stdin);
scanf_s("%i", &op);
switch (op){
case 1: for (i = 0; i < n+1; i++){
cont = 0;
for (int j = 0; j < n - 1; j++)
{
if (s[j].cedula > s[j + 1].cedula){
aux = s[j+1];
s[j + 1] = s[j];
s[j] = aux;
cont++;
}
}
if (cont == 0) break;
}
mostrar(s, n);
break;
case 2: for (i = 0; i < n + 1; i++){
cont = 0;
for (int j = 0; j < n - 1; j++)
{
if (s[j].apellido[0] > s[j + 1].apellido[0]){
aux = s[j+1];
s[j + 1] = s[j];
s[j] = aux;
cont++;
}
}
if (cont == 0) break;
}
mostrar(&s[0], n);
break;
}
}
void guardarArch(FILE * ff, struct Registro * s, int n){
fopen_s(&ff, "Datos.txt", "w");
int i;
for (i = 0; i < n; i++){
fprintf(ff,"%d", s[i].cedula); fprintf(ff, "\n");
fprintf(ff, s[i].nombre); fprintf(ff, "\n");
fprintf(ff, s[i].apellido); fprintf(ff, "\n");
fprintf(ff, s[i].direccion); fprintf(ff, "\n");
fprintf(ff, "%d",s[i].ingreso); fprintf(ff, "\n");
}
fclose(ff);
}
void leerArch(FILE * ff, struct Registro * s, int * n){
fopen_s(&ff, "Datos.txt", "r");
int i = 0;
while (!feof(ff)){
}
fclose(ff);
}
void main(){
FILE * infor = new FILE;
struct Registro informacion[30];
int op = -1;
int persona = 0;
while (op != 0){
printf("1 para agregar una persona\n");
printf("2 para mostrar\n");
printf("3 para borrar\n");
printf("4 para mostrar ordenado\n");
printf("5 para guardarlo en un archivo\n");
printf("6 para leer de un archivo\n");
printf("0 para salir\n");
scanf_s("%i", &op);
fflush(stdin);
switch (op)
{
case 1: agregarP(&informacion[0], &persona);
printf("%i", persona);
break;
case 2: mostrar(&informacion[0], persona);
break;
case 3: borrar(&informacion[0], &persona);
break;
case 4: mostrarPorOrden(&informacion[0], persona);
break;
case 5: guardarArch(infor, &informacion[0], persona);
break;
case 6: leerArch(infor, &informacion[0], &persona);
break;
}
system("pause");
system("cls");
}
}
PD: Sorry for my english.
Edited.
This is the part where I'm having trouble, it breaks automatically. It reads the stuff now but with a lot of new lines
int ayudaLeer(FILE * ff, struct Registro * s, int * n){
if (feof(ff)) return -1;
char * c = new char[];
int p = fgetc(ff);
fscanf_s(ff, "%d", &s[*n].cedula);
fgets(c, 20, ff);
fgets(s[*n].nombre, 20, ff);
fgets(s[*n].apellido, 20, ff);
fgets(s[*n].direccion, 20, ff);
fscanf_s(ff, "%d", &s[*n].ingreso);
*n+=1;
ayudaLeer(ff, s, n);
}
void leerArch(FILE * ff, struct Registro * s, int * n){
fopen_s(&ff, "Datos.txt", "r");
int i = 0;
ayudaLeer(ff, s, &i);
*n = i-1;
fclose(ff);
}

How to use research in C with struct?

Can someone help me? the error is in the research which is "pesquisar" in portuguese. I just wanna know why it doesn't work. The code is not printing the search result. Any help is good. The code is in portuguese but I think it won't be a problem. Thank u all.
struct fichacarro {
char fabricante[15];
char modelo[15];
char combustivel[10];
char cor[10];
char placa[10];
int ano;
int km;
float preco;
};
int inserir(struct fichacarro carro[], int *x, int *f) {
printf("\nModelo: ");
fflush(stdin);
fgets(carro[*x].modelo, 15, stdin);
printf("Fabricante: ");
fflush(stdin);
fgets(carro[*x].fabricante, 15, stdin);
printf("Combustivel (alcool, gasolina ou diesel): ");
fflush(stdin);
fgets(carro[*x].combustivel, 10, stdin);
printf("Cor (branco, preto ou prata): ");
fflush(stdin);
fgets(carro[*x].cor, 10, stdin);
printf("Placa: ");
fflush(stdin);
fgets(carro[*x].placa, 10, stdin);
printf("Ano: ");
scanf("%d", &carro[*x].ano);
printf("Kilometros: ");
scanf("%d", &carro[*x].km);
printf("Preco: ");
scanf("%f", &carro[*x].preco);
*x = *x + 1;
*f = *f + 1;
system("cls");
}
int excluir(struct fichacarro carro[], int *x, int *f) {
int k, j;
printf("Digite o indice do carro que quer excluir: ");
scanf("%d", &k);
k = k - 1;
if (k>*x || k < 0)
printf("Indice nao existe");
else {
j = k;
while (j<*x) {
strcpy(carro[j].modelo, carro[j + 1].modelo);
strcpy(carro[j].fabricante, carro[j + 1].fabricante);
strcpy(carro[j].combustivel, carro[j + 1].combustivel);
strcpy(carro[j].cor, carro[j + 1].cor);
strcpy(carro[j].placa, carro[j + 1].placa);
carro[j].ano = carro[j + 1].ano;
carro[j].km = carro[j + 1].km;
carro[j].preco = carro[j + 1].preco;
j = j + 1;
}
*x = *x - 1;
*f = *f - 1;
}
}
int pesquisar(struct fichacarro carro[], int *x, int f) {
int y, j;
char cor[10];
float preco;
char fabricante[15];
printf("\n----OPCOES DE PESQUISA----\n");
printf("1 - Ler o nome do fabricante e informar todos os veiculos deste fabricante.\n");
printf("2 - Pesquisar os dados de veículos com o preço dentro de um limite fornecido.\n");
printf("3 - Informar todos os veículos de determinada cor pesquisada\n\n");
printf("Opcao escolhida: ");
scanf("%d", &y);
switch (y) {
case 1:
printf("\nDigite o nome do fabricante: ");
fflush(stdin);
fgets(fabricante, 15, stdin);
j = *x;
while (j < f) {
if (strcmp(fabricante, carro[j].fabricante) == 0);
{
printf("\nCarro: %d", j); // <---it doesn't work
printf("\nModelo: %s\n", carro[j].modelo);// <---it doesn't work
}
j = j + 1;
}
system("pause");
system("cls");
break;
case 2:
printf("Preco limite: ");
scanf("%f", &preco);
j = *x;
while (j < f) {
if (carro[j].preco <= preco);
{
printf("\nCarro: %d", j); // <---it doesn't work
printf("\nModelo: %s", carro[j].modelo); // <---it doesn't work
printf("\nFabricante: %s", carro[j].fabricante);// <---it doesn't work
printf("\nCombustivel: %s", carro[j].combustivel); // <---it doesn't work
printf("\nCor: %s", carro[j].cor); // <---it doesn't work
printf("\nPlaca: %s", carro[j].placa); // <---it doesn't work
printf("\nAno: %d", carro[j].ano); // <---it doesn't work
printf("\nKm: %d", carro[j].km); // <---it doesn't work
printf("\nPreco: %f\n", carro[j].preco); // <---it doesn't work
}
j = j + 1;
}
system("pause");
system("cls");
break;
case 3:
printf("Cor: ");
fflush(stdin);
fgets(cor, 10, stdin);
j = *x;
while (j < f) {
if (carro[j].cor == cor);
{
printf("\nCarro: %d", j); // <---it doesn't work
printf("\nModelo: %s\n", carro[j].modelo); // <---it doesn't work
}
j = j + 1;
}
system("pause");
system("cls");
break;
default:
system("cls");
printf("Nao encontrado.\n\n");
system("pause");
system("cls");
break;
}
}
int main() {
struct fichacarro carro[49];
int n, x = 0, y, cont, f = 0;
printf("Numero de acoes: ");
scanf("%d", &n);
system("cls");
for (cont = 0; cont < n; cont++) {
printf("----OPCOES DE ESCOLHA----\n\n");
printf("1 - Inserir veiculo\n");
printf("2 - Excluir veiculo\n");
printf("3 - Pesquisar veiculo\n");
printf("4 - Sair\n\n");
printf("Opcao escolhida: ");
scanf("%d", &y);
switch (y) {
case 1:
inserir(carro, &x, &f);
break;
case 2:
excluir(carro, &x, &f);
break;
case 3:
pesquisar(carro, &x, f);
break;
case 4:
x = n;
break;
default:
system("cls");
printf("Nao encontrado.\n\n");
system("pause");
system("cls");
break;
}
}
return 0;
}

Resources