Ir ao conteúdo
  • Cadastre-se

C Programa em c poucos argumentos para a chamada


Daniel Pio

Posts recomendados


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<locale.h>
#include<ctype.h>


int primeiroch(char ch) {
    if (islower(ch)) {
        printf("\nMinusculo %i X 2\n", ch);
        return ch * 2;
    }
    else if (isupper(ch)) {
        printf("\nMaiusculo %i / 10\n", ch);
        return ch / 10;
    }
    else {
        printf("\não é uma letro %i X 2\n", ch);
        return ch * 2;
    }
}
int main()
{
    setlocale(LC_ALL, "");
    int m = 0;
    int n = 0;
    while (!(m >= 1 && m <= 10)) {
        system("cls");
        printf("Entre com o valor de M para criar a matriz: ");
        scanf_s("%i", &m);
        fflush(stdin);
    }
    while (!(n >= 1 && n <= 10)) {
        system("cls");
        printf("Entre com o valor de N para criar a matriz: ");
        scanf_s("%i", &n);
        fflush(stdin);
    }
    printf("Matriz criada M x N = %i x %i\n", m, n);
    
    char matriz[10][10];
    char contar[100];
    int i = 0;
    int j = 0;
    int l = 0;
    char ch;
    int count_t = 0;
    for (i = 0; i < m; i++) {
        for (i = 0; i < m; i++) {
            printf("\nPreencha %i x %i com algum caractere", (i + l), (j + l));
            gets(ch);
            matriz[i][j] = ch;
            contar[count_t] = ch;
            count_t++;
            fflush(stdin);
        }
        printf("\n");
    }
    print("\n\n");
    char contar2[100];
    strcpy_s(contar2, NULL);
    for (l = 0; l < contar2; l++) {
        bool ver = false;
        int count_ch = 0;
        char chv[2];
        chv[0] = contar[1];
        chv[0] = tolower(chv[0]);
        for (i = 0; i < m; i++) {
            for (j = 0; j < m; j++) {
                if (chv[0] == tolower(matriz[i][j]) && ((strchr(contar2, chv[0])) == NULL)) {
                    count_ch++;
                    ver = true;
                }
            }
        }
        strcat_s(contar2, chv);
        if (ver) {
            printf("%c foi encontrado %i na matriz\n", chv[0], count_ch);
        }
    }
    printf("\N O total de caracteres da matriz é %i\n", count_t);
    int re = primeiroch(matriz[0][0]);
    printf("\nResultado: %i %c \n", re, re);
    system("pause");
    return 0;
    }


Se alguém puder ajudar fico agradecido...

Link para o comentário
Compartilhar em outros sites

6 minutos atrás, Daniel Pio disse:

 strcpy_s(contar2, NULL);

 

Leu o manual? Você tem um livro?

 

Seu IDE não mostra os parâmetros da função? Use um IDE que mostra os parâmetros.no automático...

 

E já veria que 

 

image.png.988197b3839098a9bb944167dd930037.png

 

 

São 3 parâmetros, seu programa tem... 2

Então falta: 1.

 

image.png

adicionado 1 minuto depois
4 minutos atrás, Daniel Pio disse:

onde estou errando, so me retorna: poucos argumentos para a chamada na linha: strcpy_s(contar2, NULL); e strcat_s(contar2, chv);


 o mesmo erro
 

image.png.0b2d1487b16c32243849694b5fb81624.png


https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/strcat-s-wcscat-s-mbscat-s?view=vs-2019

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Daniel Pio strcpy_s() é diferente de strcpy(), e strcat_s() é diferente de strcat(). A diferença é a segurança:

char buffer[6];  // 6 caracteres
char string[] = "string com mais de 6 caracteres";

strcpy( buffer, string ); // buffer overflow
strcpy_s( buffer, 6, string ); // tamanho definido para 6 caracteres
Link para o comentário
Compartilhar em outros sites

@arfneto Obrigado por me ajudar mas não tenho IDE e nem livro, estou em um curso técnico a distancia, o mesmo  está na falta de livros ou impossibilitado de envia-los.

Vou pesquisar sobre os parâmetros.

adicionado 13 minutos depois

Agora deu: variável local não inicializada na linha:  

gets(ch);

 

Link para o comentário
Compartilhar em outros sites

9 minutos atrás, Daniel Pio disse:

Obrigado por me ajudar mas não tenho IDE e nem livro, estou em um curso técnico a distancia, o mesmo  está na falta de livros ou impossibilitado de envia-los.

Vou pesquisar sobre os parâmetros.

 

A ideia dessas funções _s é que as versões originais não tem limite, por exemplo scanf() quando você lê uma string. E assim o cara pode digitar qualquer coisa. Quanto quiser de QUALQUER coisa. Então seria uma abertura até para injeção de código, hacking. 

 

Então a proposta da microsoft era criar versões novas seguras e passar isso para o padrão da linguagem. Mas isso nunca passou pelos comitês ISO da linguagem, até onde eu sei. E ficou como uma extensão.

 

Claro que nos casos de int ou char o tamanho já é definido pelo próprio char ou int e por isso não tem parâmetros a mais. MAs no caso de uma string aparece o terceiro parâmetro. o comprimento

 

Você pode conseguir um livro em PDF talvez... e guarde o site que eu te mandei

Link para o comentário
Compartilhar em outros sites

33 minutos atrás, arfneto disse:

 

 

valeu

adicionado 57 minutos depois
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<locale.h>
#include<ctype.h>


int primeiroch(char ch) {
    if (islower(ch)) {
        printf("\nMinusculo %i X 2\n", ch);
        return ch * 2;
    }
    else if (isupper(ch)) {
        printf("\nMaiusculo %i / 10\n", ch);
        return ch / 10;
    }
    else {
        printf("\não é uma letro %i X 2\n", ch);
        return ch * 2;
    }
}
int main()
{
    setlocale(LC_ALL, "");
    int m = 0;
    int n = 0;
    while (!(m >= 1 && m <= 10)) {
        system("cls");
        printf("Entre com o valor de M para criar a matriz: ");
        scanf_s("%i", &m);
        fflush(stdin);
    }
    while (!(n >= 1 && n <= 10)) {
        system("cls");
        printf("Entre com o valor de N para criar a matriz: ");
        scanf_s("%i", &n);
        fflush(stdin);
    }
    printf("Matriz criada M x N = %i x %i\n", m, n);
    
    char matriz[10][10];
    char contar[100];
    int i = 0;
    int j = 0;
    int l = 0;
    char ch;
    int count_t = 0;
    for (i = 0; i < m; i++) {
        for (i = 0; i < m; i++) {
            printf("\nPreencha %i x %i com algum caractere", (i + l), (j + l));
            gets(ch);
            ch = matriz[i][j];
            ch = contar[count_t];
            count_t++;
            fflush(stdin);
        }
        printf("\n");
    }
    print("\n\n");
    char contar2[100];
    strcpy_s(contar2, 0, ' ');
    for (l = 0; l < contar2; l++) {
        bool ver = false;
        int count_ch = 0;
        char chv[2];
        chv[0] = contar[1];
        chv[0] = tolower(chv[0]);
        for (i = 0; i < m; i++) {
            for (j = 0; j < m; j++) {
                if (chv[0] == tolower(matriz[i][j]) && ((strchr(contar2, chv[0])) == NULL)) {
                    count_ch++;
                    ver = true;
                }
            }
        }
        strcat_s(contar2, 0, chv);
        if (ver) {
            printf("%c foi encontrado %i na matriz\n", chv[0], count_ch);
        }
    }
    printf("\N O total de caracteres da matriz é %i\n", count_t);
    int re = primeiroch(matriz[0][0]);
    printf("\nResultado: %i %c \n", re, re);
    system("pause");
    return 0;
    }

Erro variável local não inicializada em 

gets(ch);

Alguém ai pra me ajudar?

Link para o comentário
Compartilhar em outros sites

	strcpy_s(contar2, 0, ' ');

	strcat_s(contar2, 0, chv);

Qual o propósito de passar zero como o tamanho da área de destino? Assim deve imaginar quanto vai ler. Não vai ler nada.

 

image.png.52d28beaa3217bd51f15f12967755205.png

 

Você compila direto na linha de comando? Que compilador você usa?

 

image.png.b39623e7f40cacef0c94c8927e975e73.png

 

Está vendo algo errado?

 

Se gets() espera por um char* e você passou um char... 

Entenda que gets() precisa poder gravar no endereço. E não pode gravar em ch porque é constante, o endereço é constante. Use  chv  por exemplo

 

Mas no geral deve evitar gets() pela mesma razão que usou as outras funções _s(). Use fgets() e não gets()

image.png

adicionado 1 minuto depois

Não use fflush(stdin). fflush() só está definido para fluxos de saída...

Link para o comentário
Compartilhar em outros sites

5 minutos atrás, Daniel Pio disse:

Valeu.

Vou tentar.

 

 

Claro. Não há razão pra desistir. Mas fique atento. Você errou igualzinho no programa do outro tópico. E ainda errou corrigindo o que estava certo.

 

Computadores são muito monótonos. Sempre vão dar os mesmos erros. Nós é que temos que mudar ;) 

Link para o comentário
Compartilhar em outros sites

@arfneto

Me ajude!! 

Erro de novo.


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<locale.h>
#include<ctype.h>


int primeiroch(char ch) {
	if (islower(ch)) {
		printf("\nMinusculo %i X 2\n", ch);
		return ch * 2;
	}
	else if (isupper(ch)) {
		printf("\nMaiusculo %i / 10\n", ch);
		return ch / 10;
	}
	else {
		printf("\não é uma letro %i X 2\n", ch);
		return ch * 2;
	}
}
int main()
{
	setlocale(LC_ALL, "");
	int m = 0;
	int n = 0;
	while (!(m >= 1 && m <= 10)) {
		system("cls");
		printf("Entre com o valor de M para criar a matriz: ");
		scanf_s("%i", &m);
		fflush(stdin);
	}
	while (!(n >= 1 && n <= 10)) {
		system("cls");
		printf("Entre com o valor de N para criar a matriz: ");
		scanf_s("%i", &n);
		fflush(stdin);
	}
	printf("Matriz criada M x N = %i x %i\n", m, n);

	char matriz[10][10];
	char contar[100];
	int i = 0;
	int j = 0;
	int l = 0;
	char ch = ' ';
	int count_t = 0;
	for (i = 0; i < m; i++) {
		for (j = 0; j < m; j++) {
			printf("\nPreencha %i x %i com algum caractere", (i + l), (j + l));
			fgets(ch, 10, stdin);
			matriz[i][j] = ch;
			contar[count_t] = ch;
			count_t++;
			fflush(stdin);
		}
		printf("\n");
	}
	printf("\n\n");
	char contar2[100];
	strcpy_s(contar2, 2, NULL);
	for (l = 0; l < contar2; l++) {
		bool ver = false;
		int count_ch = 0;
		char chv[2];
		chv[0] = contar[1];
		chv[0] = tolower(chv[0]);
		for (i = 0; i < m; i++) {
			for (j = 0; j < m; j++) {
				if (chv[0] == tolower(matriz[i][j]) && ((strchr(contar2, chv[0])) == NULL)) {
					count_ch++;
					ver = true;
				}
			}
		}
		strcat_s(contar2, 2, chv);
		if (ver) {
			printf("%c foi encontrado %i na matriz\n", chv[0], count_ch);
		}
	}
	printf("\N O total de caracteres da matriz é %i\n", count_t);
	int re = primeiroch(matriz[0][0]);
	printf("\nResultado: %i %c \n", re, re);
	system("pause");
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

char ch = ' ';
	int count_t = 0;
	for (i = 0; i < m; i++) {
		for (j = 0; j < m; j++) {
			printf("\nPreencha %i x %i com algum caractere", (i + l), (j + l));
			fgets(ch, 10, stdin);
			matriz[i][j] = ch;

 

Como eu disse, computadores são muito monótonos e repetitivos. Enquanto você insistir em escrever errado vai dar erro. Está lendo mesmo o que eu te explico? Isso antes estava mais certo. Porque mudou? Não escreva uma única linda de programa sem razão.

 

Vou te mostrar o mesmo desenho

 

image.png.aa6ada7920e559ee96bb0029311286d6.png

 

O Visual Studio te mostra na tela a declaração. Também te mostrei esse desenho. Não é possível você insistir.

 

Leu a parte em que eu te falei sobre fflush() ser para fluxos de saída? Porque está ainda no programa?

 

Porque continua achando que pode ler algo em cima de uma constante?

 

Porque ainda acha que pode ler DEZ bytes em um único char? E está então duas vezes errado?

 

Porque não faz o óbvio e lê direto na matriz?

 

 

Link para o comentário
Compartilhar em outros sites

20 minutos atrás, arfneto disse:

char ch = ' ';
	int count_t = 0;
	for (i = 0; i < m; i++) {
		for (j = 0; j < m; j++) {
			printf("\nPreencha %i x %i com algum caractere", (i + l), (j + l));
			fgets(ch, 10, stdin);
			matriz[i][j] = ch;

 

Como eu disse, computadores são muito monótonos e repetitivos. Enquanto você insistir em escrever errado vai dar erro. Está lendo mesmo o que eu te explico? Isso antes estava mais certo. Porque mudou? Não escreva uma única linda de programa sem razão.

 

Vou te mostrar o mesmo desenho

 

image.png.aa6ada7920e559ee96bb0029311286d6.png

 

O Visual Studio te mostra na tela a declaração. Também te mostrei esse desenho. Não é possível você insistir.

 

Leu a parte em que eu te falei sobre fflush() ser para fluxos de saída? Porque está ainda no programa?

 

Porque continua achando que pode ler algo em cima de uma constante?

 

Porque ainda acha que pode ler DEZ bytes em um único char? E está então duas vezes errado?

 

Porque não faz o óbvio e lê direto na matriz?

 

 

Não estou entendendo o desenho..

Estou errando na parte do fgets?


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<locale.h>
#include<ctype.h>


int primeiroch(char ch) {
	if (islower(ch)) {
		printf("\nMinusculo %i X 2\n", ch);
		return ch * 2;
	}
	else if (isupper(ch)) {
		printf("\nMaiusculo %i / 10\n", ch);
		return ch / 10;
	}
	else {
		printf("\não é uma letro %i X 2\n", ch);
		return ch * 2;
	}
}
int main()
{
	setlocale(LC_ALL, "");
	int m = 0;
	int n = 0;
	while (!(m >= 1 && m <= 10)) {
		system("cls");
		printf("Entre com o valor de M para criar a matriz: ");
		scanf_s("%i", &m);
		
	}
	while (!(n >= 1 && n <= 10)) {
		system("cls");
		printf("Entre com o valor de N para criar a matriz: ");
		scanf_s("%i", &n);
		
	}
	printf("Matriz criada M x N = %i x %i\n", m, n);

	char matriz[10][10];
	char con[100];
	int i = 0;
	int j = 0;
	int l = 0;
	int con1 = 0;
	char ch = ' ';
	int count_t = 0;
	for (i = 0; i < m; i++) {
		for (j = 0; j < m; j++) {
			printf("\nPreencha %i x %i com algum caractere", (i + l), (j + l));
			fgets(matriz[i][j], 1, stdin);
			con[con1] = ch;
			con1++;
			
		}
		printf("\n");
	}
	printf("\n\n");
	char con2[100];
	strcpy_s(con2, 1, NULL);
	for (l = 0; l < con2; l++) {
		bool ver = false;
		int conch = 0;
		char chv[2];
		chv[0] = con[1];
		chv[0] = tolower(chv[0]);
		for (i = 0; i < m; i++) {
			for (j = 0; j < m; j++) {
				if (chv[0] == tolower(matriz[i][j]) && ((strchr(con2, chv[0])) == NULL)) {
					conch++;
					ver = true;
				}
			}
		}
		strcat_s(con2, 1, chv);
		if (ver) {
			printf("%c foi encontrado %i na matriz\n", chv[0], conch);
		}
	}
	printf("\N O total de caracteres da matriz é %i\n", con1);
	int re = primeiroch(matriz[0][0]);
	printf("\nResultado: %i %c \n", re, re);
	system("pause");
	return 0;
}

 

adicionado 22 minutos depois

@Lucca Rodrigues

Não consigo ver onde estou errando..

pode me ajudar?


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<locale.h>
#include<ctype.h>


int primeiroch(char ch) {
	if (islower(ch)) {
		printf("\nMinusculo %i X 2\n", ch);
		return ch * 2;
	}
	else if (isupper(ch)) {
		printf("\nMaiusculo %i / 10\n", ch);
		return ch / 10;
	}
	else {
		printf("\não é uma letro %i X 2\n", ch);
		return ch * 2;
	}
}
int main()
{
	setlocale(LC_ALL, "");
	int m = 0;
	int n = 0;
	while (!(m >= 1 && m <= 10)) {
		system("cls");
		printf("Entre com o valor de M para criar a matriz: ");
		scanf_s("%i", &m);
		
	}
	while (!(n >= 1 && n <= 10)) {
		system("cls");
		printf("Entre com o valor de N para criar a matriz: ");
		scanf_s("%i", &n);
		
	}
	printf("Matriz criada M x N = %i x %i\n", m, n);

	char matriz[10][10];
	char con[10];
	int i = 0;
	int j = 0;
	int l = 0;
	int con1 = 0;
	char ch = ' ';
	int count_t = 0;
	for (i = 0; i < m; i++) {
		for (j = 0; j < m; j++) {
			printf("\nPreencha %i x %i com algum caractere: ", (i + l), (j + l));
			gets(ch);
			matriz[i][j] = ch;
			con[con1] = ch;
			con1++;
			
		}
		printf("\n");
	}
	printf("\n\n");
	char con2[100];
	strcpy_s(con2, 2, NULL);
	for (l = 0; l < con2; l++) {
		bool ver = false;
		int conch = 0;
		char chv[2];
		chv[0] = con[1];
		chv[0] = tolower(chv[0]);
		for (i = 0; i < m; i++) {
			for (j = 0; j < m; j++) {
				if (chv[0] == tolower(matriz[i][j]) && ((strchr(con2, chv[0])) == NULL)) {
					conch++;
					ver = true;
				}
			}
		}
		strcat_s(con2, 2, chv);
		if (ver) {
			printf("%c foi encontrado %i na matriz\n", chv[0], conch);
		}
	}
	printf("\N O total de caracteres da matriz é %i\n", con1);
	int re = primeiroch(matriz[0][0]);
	printf("\nResultado: %i %c \n", re, re);
	system("pause");
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

image.png.3dc65b50d1fb3468ae6f7cf1c8637393.png

 

 

34 minutos atrás, Daniel Pio disse:

Não estou entendendo o desenho..

 

Se não entende o desenho porque alterou a chamada?

 

image.png.1afab2f68f954fc4a234ff8ba990f9df.png

fgets() e gets() esperam um endereço pra onde ler algo. Não pode passar uma constante. Te falei isso umas 3 vezes em que tentava ler um char. Isso depois que você mudou char ch[2] que estava certo para char.

E depois passou a chamar fgets() passando DEZ como o tamanho.

 

É só isso. E porque gets() voltou e não fgets()?

 

Acho que nesse tópico 

 

teve uma discussão sobre esse problema e alguns exemplos. E eu postei dois bem didáticos e com comentários e resultados

 

De volta ao desenho
 

image.png.184c902db49cbff5fdd02e3386aac1b8.png

 

Se fgets() espera um char* como primeiro argumento poruqe acha que pode usar um char?

 

Se o segundo parâmetro é o tamanho porque passou 10 se quer ler só um?

 

Se quer o valor em matriz[j] porque tenta ler em ch pra depois copiar?

 

Como eu disse, não escreva uma única linha de programa sem propósito. Pode tropeçar nela.

 

Não seria mais simples fgets( matriz[ i ] [ j ], 1, stdin ); ?

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!