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
Related
To solve my problem I need to get out of the while loop if the str2 is empty.
while (elementos <= tamanho - jogada || str2 == NULL);
This is the code:
#include <stdio.h>
#include <string.h>
#define BUFFER 100
unsigned int randaux() {
static long seed = 1;
return (((seed = seed * 214013L + 2531011L) >> 16) & 0x7fff);
}
/* Implementação do procedimento MostraLamberta */
unsigned int MostraLamberta(int *tabuleiro, int tamanho) {
int i, casa, elementos;
int jogada = 0;
char novostr[BUFFER], str2[BUFFER]; /* novo vetor para receber os char */
do {
scanf("%d %d", &casa, &elementos);
for (i = 0; i < tamanho; i++) { /*Loop para percorrer o int tabuleiro um a um */
if (tabuleiro[i] == 0) { /*Comparar se for 0 vai para o vetor como O */
novostr[i] = 'O';
} else { /* Se não vai para o vetor como X */
novostr[i] = 'X';
}
}
if (tamanho >= 10) {
novostr[i] = '\0';
for (i = 1; i < tamanho; i++) {
if (i == 10) {
printf("%d", (i) / 10);
} else {
printf(" ");
}
}
printf("\n");
for (i = 1; i < tamanho + 1; i++) {
if (i >= 10) {
printf("%d", i % 10);
} else {
printf("%d", i);
}
printf;
}
} else {
for (i = 0; i < tamanho; i++) {
if (i == 10) {
printf("%d", i % 10);
} else {
printf("%d", i + 1);
}
}
}
printf("\n");
novostr[i] = '\0'; /*Termina a string */
jogada++;
printf("%s", novostr);
printf("\nJogada [%d]: %d %d", jogada, casa, elementos); /*Imprime nova string */
for (i = casa - 1; i < elementos + casa - 1; i++) {
if (tabuleiro[i] == 0) { /*Comparar se for 0 vai para o vetor como O */
novostr[i] = 'X';
tabuleiro[i] = 1;
continue;
} else { /* Se não vai para o vetor como X */
novostr[i] = 'O';
tabuleiro[i] = 0;
str2[i] = tabuleiro[i];
}
novostr[i] = '\0';
printf("%d", str2[i]);//in here if its empty, the loop is over
}
printf("\n");
} while (elementos <= tamanho - jogada || str2 == NULL);
if (jogada % 2 == 0) {
printf("Jogada inválida, perde jogador 2.");
} else {
printf("Jogada inválida, perde jogador 1.");
}
}
void main() {
int i, num, saltos, tamanho, tabuleiro[BUFFER]; /*Implementa as variáveis inteiras */
scanf("%d %d", &tamanho, &saltos);
// saltar os primeiros números aleatórios, para ter sequências distintas
for (i = 0; i < saltos; i++) /*Loop */
randaux(); /*Chama a funcão randaux */
/* Chamar o procedimento para gerar um novo tabuleiro */
for (i = 0; i < tamanho; i++) {
num = randaux(); /*Grava um numero aleatório numa nova variável */
if (num % 2 == 0) { /*VC* se o numero aleatório C) par ou impar */
tabuleiro[i] = 0;
} else {
tabuleiro[i] = 1;
}
}
MostraLamberta(tabuleiro, tamanho); /*Chama a função e passa dois argumentos) */
}
[]
[]
It is unclear what your code does, but there are some problems:
the do / while loop is an error prone construction. It is less confusing to use a for (;;) (aka for ever) loop and make explicit tests to break from it, such as if (scanf("%d %d", &casa, &elementos) != 2) break;
the second part of the test while (elementos <= tamanho - jogada || str2 == NULL); is moot: str2 is an array, it cannot be NULL. If you want to test for an empty string, use str2[0] == '\0' instead.
str2 is not properly constructed: the only place where it gets modified is: str2[i] = tabuleiro[i]; but tabuleiro[i] is set to 0 just before this statement, so part of str2 is uninitialized and the only elements that get modified are null bytes.
In the OP code, the following lines get into infinite loop.
while (elementos <= tamanho - jogada || str2 == NULL);
Few potential issues to look at:
The 'str2' expression is always NON-null. Recall that in "C", the value of an array is the address of the first element. If you want to test is a string is "empty" consider strlen(str2) == 0, or similar.
For any case that str2 is "not empty", the while will go into infinite loop if elementos <= tamanho - jogada. Usually, you will see modification to one of the variables in the condition inside the loop body. e.g. jopada++
I have to make a program that reads an integer (N+) and then read a series of other integers (N+), but the program needs to check if the user has inputted chars mixed in the numbers the scanf() reads, in affirmative, the program will repeat the scanf(). So I decided to check the return value of scanf(). It works if I use only character input, but when I mixed it with integers, the program reads the integer and uses the maintained character on the buffer. How can I solve this?
#include <stdio.h>
int main() {
int tamanho = 0, verificador = 0;
do {
printf("Digite um valor n>0: ");
verificador = scanf("%d", &tamanho);
getchar();
if (verificador != 1) {
printf("\nO programa aceita apenas valores inteiros\n");
printf("Tente novamente\n");
}
} while (verificador != 1);
int conjunto[tamanho];
do {
printf("Digite os numeros do conjunto de tamanho 'n': ");
for (int i = 0; i < tamanho; i++) {
verificador = scanf("%d", &conjunto[i]);
if (verificador != 1) {
printf("\nO programa aceita apenas números\n");
printf("Tente novamente\n");
getchar();
break;
}
}
} while (verificador != 1);
printf("numero = %d\n", tamanho);
for (int i = 0; i < tamanho; i++) {
if (i <= tamanho - 2) {
printf("%d, ", conjunto[i]);
} else if (i == tamanho - 1) {
printf("%d.\n", conjunto[i]);
}
}
return 0;
}
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;
int realizar_reparaciones(int naves_a_reparar, int repuestos_laser, int repuestos_escudos, int repuestos_compensadores){
int caracter_valido = 0;
char reparacion_necesaria;
int naves_con_alambre = 0;
int contador_laser = 0;
int contador_escudo = 0;
printf ("A continuación deberá ingresar uno de los siguientes valores por nave: L (Generador Láser) o E (Generador de escudo deflector)\n");
for (int i = 1; i <= naves_a_reparar; i = i + 1){
while (caracter_valido == 0){
printf ("Ingrese la reparación que hay que realizarle a la nave %d: ", i);
scanf (" %c", &reparacion_necesaria);
switch (reparacion_necesaria){
case 'L':
if (repuestos_laser == 0){
naves_con_alambre = naves_con_alambre + 1;
} else {
repuestos_laser = repuestos_laser - 1;
contador_laser = contador_laser + 1;
}
caracter_valido = 1;
break;
case 'E':
if (repuestos_escudos == 0){
naves_con_alambre = naves_con_alambre + 1;
} else {
repuestos_escudos = repuestos_escudos - 1;
contador_escudo = contador_escudo + 1;
}
caracter_valido = 1;
break;
default:
printf ("Ingrese unicamente alguno de los caracteres previamente mencionados\n");
break;
}
}
}
printf ("Se utilizaron %d generadores láser\n", contador_laser);
printf ("Se utilizaron %d generadores de escudos deflectores\n", contador_escudo);
printf ("Se utilizaron %d compensadores de aceleracion\n", contador_compensador);
return naves_con_alambre;
I have this function in C. i can only get the FOR to run once even if "naves_a_reparar" is 30 or any high number. After that, it goes out of the FOR loop and function ends. Why is this happening?
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;
}