Olá, bem eu tenho uma pergunta(é bem provável que seja uma pergunta idiota) mas vamos lá; por que no código acima não foi colocado o caractere delimitador "\0'.
Sem o '\n` minha função estava a imprimir o restante dos caracteres como símbolos. Estou usando o compilador "Móvel c" no Android. Segue meu código. #include #include #include #define MAX 30
int main() { int op, p, qtd; char *palavra[MAX], *destino[MAX];
do { printf("1: strlen()\n"); printf("2: strcpy()\n"); printf("3: memcpy()\n"); scanf("%d",&op);
system("cls"); switch(op) { case 1: printf("strlen()\n");//conta caracteres de uma string //LimparLixo();//tentei e deu certo antes de usar a funcao switch,,case //fgets(palavra, sizeof(palavra) -1, stdin);//conta tambem o buffer \n do teclado gets(palavra); //fflush(stdin);//nao funciona com funcao fgets() p = _strlen(palavra); printf("Tamanho = %d", p); break;
case 2: printf("strcpy()\n");//copia uma string de uma variavel para outra fgets(palavra, sizeof(palavra), stdin); _strcpy(destino, palavra); //printf("Palavra [%s]", destino); // junto da funcao fgets, contabilliza o buffer '\n' puts(destino); //fflush(stdin); break;
case 3: printf("memcpy()\n");//copia quantidade de caracteres de uma string para a variavel destino //printf("Quantos caracteres copiar?\t"); //fgets(palavra, sizeof(palavra), stdin); gets(palavra); //scanf("%f", palavra); qtd = 3; //scanf("%d", &qtd); _memcpy(destino, palavra, qtd); printf("Palavra [%s]", destino); //puts(destino); break;
default: printf("Erro, digite 'sair'");
} }while(op == 'sair'); return 0; }
int _strlen(char * str) { int cont = 0; while(str[cont] != '\0') cont++; return cont; }
char *_memcpy(char * dest, char * orig, int n) { int i; for(i = 0; i < n ; i++) dest[i] = orig[i];
dest[i] = '\0';// estava a imprimir o restante dos caracteres restantes como simbolos return dest; }
void LimparLixo() { int ch; do { ch = getchar(); }while(ch != EOF && ch != '\n'); clearerr(stdin); }
1 de junho de 2018 às 19:09
memcpy: char* memcpy( char *dest, char *src, int n );
Copia os 'count' primeiros caracteres da string 'src' e coloca nas primeiras 'count' da string 'dest'.
Download do curso: Apostila C Progressivo
Como implementar a função memcpy()
orig', que é a string de origem, e a 'dest', que é a string de destino.
Ou seja, vamos pegar os 'n' primeiros caracteres da string de origem, e colocar nas 'n' primeiras posições da string de destino.
Como estamos passando strings (vetores), estamos passando seu endereço.
Logo, essa função vai alterar a string de destino.
Para fazer isso, basta fazer com que a string dest receba os 'n' primeiros caracteres (da posição 0 até a n-1) da string orig.
Veja como ficou o código C para implementar essa função:
char *memcpy(char *dest, char *orig, int n)
{
int i;
for(i=0 ; i < n ; i++)
dest[i] = orig[i];
return dest;
}
postado por Programação Progressiva às 11:38 em 14 de mar. de 2013
2 Comentários
Fechar esta janela Ir para formulário de comentárioOlá, bem eu tenho uma pergunta(é bem provável que seja uma pergunta idiota) mas vamos lá; por que no código acima não foi colocado o caractere delimitador "\0'.
30 de abril de 2015 às 15:11
Sem o '\n` minha função estava a imprimir o restante dos caracteres como símbolos.
Estou usando o compilador "Móvel c" no Android. Segue meu código.
#include
#include
#include
#define MAX 30
int _strlen(char * str);
char *_strcpy(char * dest, char * orig);
char *_memcpy(char * dest, char * orig, int);
void LimparLixo();
int main()
{
int op, p, qtd;
char *palavra[MAX], *destino[MAX];
do
{
printf("1: strlen()\n");
printf("2: strcpy()\n");
printf("3: memcpy()\n");
scanf("%d",&op);
system("cls");
switch(op)
{
case 1:
printf("strlen()\n");//conta caracteres de uma string
//LimparLixo();//tentei e deu certo antes de usar a funcao switch,,case
//fgets(palavra, sizeof(palavra) -1, stdin);//conta tambem o buffer \n do teclado
gets(palavra);
//fflush(stdin);//nao funciona com funcao fgets()
p = _strlen(palavra);
printf("Tamanho = %d", p);
break;
case 2:
printf("strcpy()\n");//copia uma string de uma variavel para outra
fgets(palavra, sizeof(palavra), stdin);
_strcpy(destino, palavra);
//printf("Palavra [%s]", destino); // junto da funcao fgets, contabilliza o buffer '\n'
puts(destino);
//fflush(stdin);
break;
case 3:
printf("memcpy()\n");//copia quantidade de caracteres de uma string para a variavel destino
//printf("Quantos caracteres copiar?\t");
//fgets(palavra, sizeof(palavra), stdin);
gets(palavra);
//scanf("%f", palavra);
qtd = 3;
//scanf("%d", &qtd);
_memcpy(destino, palavra, qtd);
printf("Palavra [%s]", destino);
//puts(destino);
break;
default:
printf("Erro, digite 'sair'");
}
}while(op == 'sair');
return 0;
}
int _strlen(char * str)
{
int cont = 0;
while(str[cont] != '\0')
cont++;
return cont;
}
char *_strcpy(char * dest, char * orig)
{
int i;
for(i = 0 ; i < _strlen(orig) ; i++ )
dest[i] = orig[i];
dest[i] = '\0';
return dest;
}
char *_memcpy(char * dest, char * orig, int n)
{
int i;
for(i = 0; i < n ; i++)
dest[i] = orig[i];
dest[i] = '\0';// estava a imprimir o restante dos caracteres restantes como simbolos
return dest;
}
void LimparLixo()
{
int ch;
do
{
ch = getchar();
}while(ch != EOF && ch != '\n');
clearerr(stdin);
}
1 de junho de 2018 às 19:09