Médio C
Cópia segura com strncpy
Enunciado
Escreva um programa que copie a string "Engenharia de Software" para um buffer de 15 caracteres usando strncpy e garanta que o buffer termine com '\0'. Exiba o conteúdo copiado e o comprimento resultante.
Requisitos
- Use
strncpycom o tamanho do buffer menos 1. - Atribua
'\0'explicitamente na última posição do buffer. - Imprima o conteúdo e o comprimento no formato
Copia: <texto>eComprimento: <n>.
Código inicial
#include <stdio.h>
#include <string.h>
int main(void) {
const char *origem = "Engenharia de Software";
char buffer[15];
// Complete a cópia segura
return 0;
}
Saída esperada
Copia: Engenharia de
Comprimento: 14
Ver dica
O buffer tem 15 posições; use sizeof(buffer) - 1 como limite e depois coloque '\0' na posição 14.
Mostrar solução
#include <stdio.h>
#include <string.h>
int main(void) {
const char *origem = "Engenharia de Software";
char buffer[15];
// Copia no maximo 14 caracteres (buffer - 1) para caber o '\0'
strncpy(buffer, origem, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0'; // Garante terminacao
printf("Copia: %s\n", buffer);
printf("Comprimento: %zu\n", strlen(buffer));
return 0;
}
Passo a passo
- Declaramos
origemcomoconst char *apontando para a string literal. - Criamos
char buffer[15], que pode armazenar até 14 caracteres mais o'\0'. strncpy(buffer, origem, sizeof(buffer) - 1)copia no máximo 14 caracteres. Como a origem tem 22 caracteres, os 14 primeiros são copiados.buffer[sizeof(buffer) - 1] = '\0'força o terminador na posição 14, garantindo que a string seja válida.strlen(buffer)retorna 14, pois conta apenas os caracteres antes do'\0'.
Por que funciona
strncpy copia até n caracteres, mas se a origem for maior ou igual a n, não adiciona o terminador. Ao reservar a última posição para '\0', evitamos que printf e strlen leiam além do buffer.
Erros comuns
- Usar
strncpy(buffer, origem, sizeof(buffer))e não terminar: o buffer fica sem'\0'eprintfpode imprimir lixo. - Esquecer de subtrair 1 no tamanho: o
'\0'não caberia. - Declarar
char buffer[15]e tentar copiar a string inteira comstrcpy: ocorre buffer overflow.
Outra forma de resolver
Usar snprintf(buffer, sizeof(buffer), "%s", origem) é mais simples e sempre termina a string. Prefira snprintf para cópias seguras.
Saída esperada
Copia: Engenharia de
Comprimento: 14