Array de Strings em C

Jinku Hu 12 outubro 2023
  1. Use a notação de array 2D para declarar um array de strings em C
  2. Use a notação de array char* para declarar o array de strings em C
Array de Strings em C

Este artigo demonstrará vários métodos sobre como declarar un array de strings em C.

Use a notação de array 2D para declarar um array de strings em C

Strings em C são simplesmente uma sequência de chars armazenada em uma região de memória contígua. Uma distinção sobre cadeias de caracteres é que há um byte nulo de terminação \0 armazenado no final da sequência, denotando o final de uma cadeia. Se declararmos um array fixo de char usando a notação [], então podemos armazenar uma string consistindo do mesmo número de caracteres naquele local.

Observe que um espaço de caractere extra para o byte nulo de terminação deve ser considerado ao copiar a sequência de caracteres para o local do array. Assim, pode-se declarar um array char bidimensional com notação de colchetes e utilizá-lo como o array de strings. A segunda dimensão do array limitará o comprimento máximo da string. Nesse caso, definimos arbitrariamente uma constante de macro - MAX_LENGTH igual a 100 caracteres. A matriz inteira pode ser inicializada com a notação {""}, que zera cada elemento char no array. Ao armazenar os valores da string no array já inicializado, o operador de atribuição não é permitido e funções especiais de cópia de memória devem ser empregadas como strcpy.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char arr[NUM_STRINGS][MAX_LENGTH] = {""};

  arr2[0] = "string literal";  // Not permitted
  strcpy(arr[0], "hello world");
  printf("%s\n", arr[0]);
  printf("%s\n", strcpy(arr[0], "hello world"));

  exit(EXIT_SUCCESS);
}

Resultado:

hello world
hello world

Alternativamente, podemos inicializar o array bidimensional char instantaneamente quando declarado. O padrão C11 moderno permite inicializar arrays char com strings literais e até armazenar byte nulo no final da string automaticamente quando o comprimento do array é maior do que a própria string. A notação da lista do inicializador é semelhante à sintaxe C++. Cada elemento entre chaves deve ser armazenado em uma região de memória consecutiva de comprimento MAX_LENGTH. No caso de a notação do inicializador especificar menos elementos do que o tamanho do array, os elementos restantes são inicializados implicitamente com \0 bytes.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char arr2[NUM_STRINGS][MAX_LENGTH] = {{"first string"},
                                        {"second string"},
                                        {"third string"},
                                        {"fourth string"},
                                        {"fifth string"}};

  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr2[i]);
  }

  exit(EXIT_SUCCESS);
}

Resultado:

first string, second string, third string, fourth string, fifth string, , , , , ,

Use a notação de array char* para declarar o array de strings em C

char* é o tipo geralmente usado para armazenar cadeias de caracteres. Declarar o array de char* nos dá o número fixo de ponteiros apontando para o mesmo número de cadeias de caracteres. Ele pode ser inicializado com literais de string conforme mostrado no exemplo a seguir, atribuído ou copiado usando funções especiais fornecidas no cabeçalho string.h.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char* arr3[NUM_STRINGS] = {"first string", "second string", "third string",
                             "fourth string", "fifth string"};
  char* str1 = "string literal";
  arr3[8] = str1;
  arr3[9] = "hello there";

  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr3[i]);
  }
  printf("\n");

  exit(EXIT_SUCCESS);
}

Resultado:

first string, second string, third string, fourth string, fifth string, (null), (null), (null), string literal, hello there,

Como alternativa, pode-se especificar as chaves {} apenas, que inicializarão os ponteiros no array para null, e eles podem ser usados ​​posteriormente para armazenar outros endereços de string, ou o programador pode até mesmo alocar memória dinâmica.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM_STRINGS 10

int main() {
  char *arr4[NUM_STRINGS] = {};
  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr4[i]);
  }
  printf("\n");

  exit(EXIT_SUCCESS);
}

Resultado:

(null), (null), (null), (null), (null), (null), (null), (null), (null), (null),
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C Array

Artigo relacionado - C String