Enviado em 17/03/2017 - 20:40h
#include <stdio.h> #include <stdlib.h> void verbin(); int main() { verbin(); return 0; } void verbin() { printf("\nOLA!"); system("pause"); }
Enviado em 17/03/2017 - 21:48h
Ao meu ver, o código compila. Veja: https://ideone.com/J5qOCSEnviado em 17/03/2017 - 22:00h
Enviado em 18/03/2017 - 12:04h
Eu também não consegui reproduzir o erro que você indicou, pois o seu programa parece correto, tanto em C quanto em C++.Enviado em 18/03/2017 - 13:23h
Enviado em 18/03/2017 - 13:56h
Aqui esta o meu verdadeiro projeto!Enviado em 18/03/2017 - 15:06h
O problema não é o void.$ gcc -Wall -Werror -O2 -pedantic-errors x.c x.c: In function ‘main’: x.c:17:12: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[100]’ [-Werror=format=] printf("%s", &nome); ^
x.c:166:12: error: implicit declaration of function ‘getch’ [-Wimplicit-function-declaration] op = getch(); ^ x.c:176:16: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[100]’ [-Werror=format=] printf("%s", &nome); ^
x.c:10:16: error: unused variable ‘x’ [-Werror=unused-variable] int aux=0, x,tams, cont1=0, bina[100][8]; ^ x.c: In function ‘verbin’: x.c:345:10: error: type of ‘tams’ defaults to ‘int’ [-Wimplicit-int] void verbin(tams,bina,nome) ^
x.c:345:10: error: type of ‘bina’ defaults to ‘int’ [-Wimplicit-int] x.c:345:10: error: type of ‘nome’ defaults to ‘int’ [-Wimplicit-int] x.c:345:10: error: argument ‘bina’ doesn’t match prototype x.c:6:6: error: prototype declaration void verbin(int tams, int bina[100][8], char nome[100]); ^ x.c:345:10: error: argument ‘nome’ doesn’t match prototype void verbin(tams,bina,nome) ^ x.c:6:6: error: prototype declaration void verbin(int tams, int bina[100][8], char nome[100]); ^ x.c:348:51: error: subscripted value is neither array nor pointer nor vector {printf("\n%c: %d%d%d%d%d%d%d%d", nome[x], bina[x][0], bina[x][1], ^ x.c:348:60: error: subscripted value is neither array nor pointer nor vector {printf("\n%c: %d%d%d%d%d%d%d%d", nome[x], bina[x][0], bina[x][1], ^ x.c:348:72: error: subscripted value is neither array nor pointer nor vector {printf("\n%c: %d%d%d%d%d%d%d%d", nome[x], bina[x][0], bina[x][1], bin ^ x.c:348:84: error: subscripted value is neither array nor pointer nor vector intf("\n%c: %d%d%d%d%d%d%d%d", nome[x], bina[x][0], bina[x][1], bina[x][2], bin ^ x.c:348:96: error: subscripted value is neither array nor pointer nor vector %d%d%d%d%d%d%d%d", nome[x], bina[x][0], bina[x][1], bina[x][2], bina[x][3], bin ^ x.c:348:108: error: subscripted value is neither array nor pointer nor vector %d%d", nome[x], bina[x][0], bina[x][1], bina[x][2], bina[x][3], bina[x][4], bin ^ x.c:348:120: error: subscripted value is neither array nor pointer nor vector x], bina[x][0], bina[x][1], bina[x][2], bina[x][3], bina[x][4], bina[x][5], bin ^ x.c:348:132: error: subscripted value is neither array nor pointer nor vector 0], bina[x][1], bina[x][2], bina[x][3], bina[x][4], bina[x][5], bina[x][6], bin ^ x.c:348:144: error: subscripted value is neither array nor pointer nor vector ][1], bina[x][2], bina[x][3], bina[x][4], bina[x][5], bina[x][6], bina[x][7]); ^ x.c: In function ‘main’: x.c:14:5: error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Werror=unused-result] scanf(" %[^\n]s", nome); ^
x.c:16:5: error: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Werror=unused-result] system("cls"); ^ x.c:160:7: error: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Werror=unused-result] system("cls"); ^ x.c:169:9: error: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Werror=unused-result] system("cls"); ^ x.c:173:9: error: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Werror=unused-result] scanf(" %[^\n]s", nome); ^ x.c:175:9: error: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Werror=unused-result] system("cls"); ^ x.c:320:9: error: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Werror=unused-result] system("cls"); ^ x.c:326:9: error: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Werror=unused-result] system("cls"); ^ cc1: all warnings being treated as errors
Enviado em 19/03/2017 - 03:04h
Como eu mencionei na mensagem anterior, sua string de formatação de scanf() tinha um erro. Eis o que você fez.scanf(" %[^\n]s", nome);
int r, a, b, c; nome[99]='\0'; // Proteção, pois nem sempre scanf() coloca o terminador na string. a=b=c=0; // contador de quantos caracteres de espaçamento foram consumidos // após a supressão de caracteres em branco // || // || contador do total de caracteres consumidos por scanf() // || ao final da leitura do nome // || || // || || contador do total de caracteres consumidos // || || ao final da string de formatação // || || || // VV VV VV r=scanf(" %n%99[^\n]%n%*1[\n]%n", &a, nome, &b, &c); // ^ ^^^^^^^^ ^^^^^^^ // | |||||||| ||||||| // | |||||||| converte string composta apenas por caracteres '\n', // | |||||||| com tamanho máximo de um caráter, mas o asterisco // | |||||||| indica que não haverá atribuição da string lida a // | |||||||| nenhum argumento // | |||||||| // | converte uma string composta por caracteres diferentes de '\n', // | com tamanho máximo de 99 bytes, atribuindo-a ao array ‘nome’. // | // provoca a supressão de qualquer quantidade de caracteres em branco // no começo do buffer de entrada if(r==EOF){ /* Erro de leitura, possivelmente devido a fim prematuro de dados na entrada, ou nenhuma parte da string de formatação corresponde à entrada. Você pode querer testar o resultado de ferror(stdin) e feof(stdin) para decidir como proceder. */ if(ferror(stdin)){ /* Trata erro de leitura. */ } else{ /* Trata fim de arquivo. */ } } else if(r==1){ /* Compara com o número de conversões com atribuição solicitado. Se for igual, todas as conversões com atribuição foram bem-sucedidas. Note que as ocorrências de “%n” fazem atribuições, mas não con- versões de dados da entrada. Logo não entram na conta. Tampouco entra a conversão cuja atribuição foi suprimida pela presença do asterisco. */ // Alguns dos testes abaixo ajudam a examinar a consistência dos dados. if(a==b){ /* Equivalente a testar se strlen(nome)==0, porém mais rápido. No seu caso particular, essa condição provavelmente nunca vai ocorrer, já que '\n' é considerado um espaço em branco, e seria suprimido da entrada antes de começar a ler o nome, por causa do espaço em branco no início da string de formatação. Contudo, se a supressão de espaços em branco não estivesse presente, ou se fosse outro o conjunto de caracteres a ser suprimido, a condição aqui testada poderia ser útil para impedir o uso de um nome vazio. */ } else if(c>b){ /* Nome tem 99 ou menos carcteres e havia um sinal de fim de linha na entrada, que foi consumido. Certamente o nome lido é válido, e você pode usá-lo aqui. */ } else if(ferror(stdin)){ /* Truncamento do nome por erro de leitura. Talvez seja perigoso usar o nome truncado nessa situação. */ } else if(feof(stdin)){ /* Truncamento do nome devido ao fim dos dados na entrada. Possivelmente menos crítico do que o truncamento por erro, mas depende da aplicação decidir se convém ou não usar o nome lido nesse caso. */ } else{ /* Usuário tentou digitar um nome longo demais, e os caracteres excedentes não foram consumidos por scanf(), permanecendo no buffer de entrada. Além de tratar o truncamento do nome, se você não quiser que os caracteres excedentes afetem futuras operações de leitura, terá de tirá-los do buffer. */ } } else{ /* Valor retornado por scanf() é diferente da quantidade total solicitada de conversões com atribuição de valor, de modo que ocorreu algum problema de formatação ou de erro durante a execução da função. No seu caso particular, só foi solicitada uma conversão com atribuição, logo o valor de r neste ponto do programa seria zero. Contudo, se você tivesse pedido N conversões na mesma string de formatação, qualquer valor entre 0 e N-1 seria indicativo de falha parcial, e uma aplicação bem comportada deveria saber tratar qualquer um desses casos. Mais ainda: sua string de formatação é composta apenas de elementos se podem indicar sucesso em caso de “zero ou mais” ocorrências (tanto a supressão de espaços quanto as conversões de strings). Então você provavelmente nunca terá um caso de sucesso parcial, e a única possi- bilidade de não sucesso total provavelmente será mesmo o caso em que r==EOF. */ }
if( // Pula espaços em branco scanf(" ")==EOF || // Lê linha após espaços em branco fgets(nome, sizeof nome, stdin)==NULL ){ /* Erro de leitura ou fim de arquivo antes de receber qualquer dado. Não há nome válido com que se trabalhar. */ if(ferror(stdin)){ /* Trata erro de leitura. */ } else{ /* Trata fim de arquivo. */ } } else{ size_t len=strlen(nome); if(nome[len]!='\n'){ /* Falta a marca de fim linha. */ if(len<sizeof nome-1){ /* Ocorreu truncamento antes de se consumirem todas as posições de ‘nome’. */ if(ferror(stdin)){ /* Trata erro de leitura. Pode ser perigoso considerar o nome lido como válido. */ } else{ /* Trata fim de arquivo. Tratar o nome como válido pode ser aceitável ou não, dependendo da aplicação. */ } } else{ /* Todas as posições foram ocupadas, mas sem a marca de fim de linha: o usuário digitou um nome grande demais. Você possivelmente vai querer descartar os dados lidos e limpar os caracteres que ainda estiverem no buffer de entrada, e depois tentar ler o nome novamente. */ } goto saida; // Sim, é goto mesmo! } else{ /* Marca de fim de linha presente. Suprime-a, pois você provavel- mente não vai querê-la como parte do nome. */ nome[len--]='\0'; } /* Aqui vai um nome válido e não-nulo, com no máximo ‘sizeof nome-2’ caracteres, que você pode usar à vontade. */ } saida:
char nome_mais_lf[1+sizeof nome]; // buffer com um byte a mais para conter quebra de linha if( // Pula espaços em branco scanf(" ")==EOF || // Lê linha após espaços em branco fgets(nome_mais_lf, sizeof nome_mais_lf, stdin)==NULL ){ /* Erro de leitura ou fim de arquivo antes de receber qualquer dado. Não há nome válido com que se trabalhar. */ if(ferror(stdin)){ /* Trata erro de leitura. */ } else{ /* Trata fim de arquivo. */ } } else{ char *const ultimo=nome+sizeof nome-1; char *p, *q; /* Copia nome lido de ‘nome_mais_lf’ para ‘nome’, suprimindo eventual quebra de linha. */ *ultimo='\0'; // Garante de antemão o terminador em ‘nome’. for(p=nome, q=nome_mais_lf; p<ultimo && (*p=*q)!='\0'; p++, q++) if(*p=='\n'){ *p='\0'; break; } /* Neste ponto, p==nome+strlen(nome) e com certeza *p=='\0'. Por sua vez, q==nome_mais_lf+strlen(nome), mas não necessariamente *p==*q. */ if(*q=='\n'){ /* A marca de fim de linha foi encontrada por fgets(), e todos os caracteres antes dela foram copiados com sucesso para ‘nome’. Pode usar o nome lido neste ponto à vontade. */ } else if(p<ultimo || *q=='\0'){ /* Nome truncado por interrupção prematura da leitura em fgets(), antes de ler ‘sizeof nome’ (que é o mesmo que ‘sizeof nome_mais_lf-1’) caracteres. */ if(ferror(stdin)){ /* Trata erro de leitura. Pode ser perigoso considerar o nome lido como válido. */ } else{ /* Trata fim de arquivo. Tratar o nome como válido pode ser aceitável ou não, dependendo da aplicação. */ } } else{ /* Usuário digitou nome grande demais, e um dos caracteres excedentes acabou sendo consumido por fgets() e guardado em ‘nome_mais_lf’, mas não há espaço para ele em ‘nome’. É possível devolver o caráter consumido a mais para o buffer de entrada, fazendo “ungetc(*q, stdin)”, mas possivelmente você vai preferir descartá-lo junto com os demais caracteres excedentes que porventura ainda estejam no buffer de entrada, e tentar uma nova leitura de um nome não truncado mais tarde. */ } }
char *const ultimo=nome+sizeof nome-1; char *p=nome; int ch; // Pula espaços em branco no início da linha. while(isspace(ch=getchar())) ; if(ch==EOF) goto trata_erros; *ultimo='\0'; for(p=nome; p<ultimo; p++) switch(ch=getchar()){ case EOF: goto trata_erros; case '\n': *p='\0'; goto saida; default: *p=ch; } /* Chegou ao fim do loop mas ainda não encontrou marca de fim de linha. Pode ser, porém, que ela seja o próximo caráter, então tenta ler mais um, e vê se é fim de linha ou não. */ ch=getchar(); if(ch==EOF) goto trata_erros; if(ch!='\n'){ /* Usuário digitou um nome grande demais. É possível devolver o caráter consumido a mais por este último getchar() para o buffer de entrada fazendo “ungetc(ch, stdin)”, mas possivelmente você vai preferir descartá-lo junto com os demais caracteres excedentes que porventura ainda estejam no buffer de entrada, e tentar uma nova leitura de um nome não truncado mais tarde. */ } goto saida; trata_erros: if(p>nome){ /* Conseguiu ler pelo menos alguns caracteres do nome. */ if(ferror(stdin)){ /* Trata erro de leitura. Pode ser perigoso considerar o nome lido como válido. */ } else{ /* Trata fim de arquivo. Tratar o nome como válido pode ser aceitável ou não, dependendo da aplicação. */ } } else{ /* O erro de leitura ou o fim dos dados ocorreu antes de ler qualquer parte do nome. */ if(ferror(stdin)){ /* Trata erro de leitura. */ } else{ /* Trata fim de arquivo. */ } } saida:
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Criando uma Infraestrutura para uma micro Empresa
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
O Que Fazer Após Instalar Fedora 42
Debian 12 -- Errata - Correções de segurança
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
O FIM da minha distro predileta: ARCOLINUX ...que pena (5)
Copiar Layout do Teclado para aplicar em outra Distribuição (1)
Não acesso a conta do Banco do Brasil pelo Google Chrome [RESOLVIDO] (3)