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 strncpy com 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> e Comprimento: <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

  1. Declaramos origem como const char * apontando para a string literal.
  2. Criamos char buffer[15], que pode armazenar até 14 caracteres mais o '\0'.
  3. strncpy(buffer, origem, sizeof(buffer) - 1) copia no máximo 14 caracteres. Como a origem tem 22 caracteres, os 14 primeiros são copiados.
  4. buffer[sizeof(buffer) - 1] = '\0' força o terminador na posição 14, garantindo que a string seja válida.
  5. 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' e printf pode imprimir lixo.
  • Esquecer de subtrair 1 no tamanho: o '\0' não caberia.
  • Declarar char buffer[15] e tentar copiar a string inteira com strcpy: 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