Strings podem ser declaradas e inicializadas de várias maneiras:
char str[10] = "Ola mundo";
Aqui, o vetor str tem espaço para até 10 caracteres. A constante "Ola mundo" ocupa 9 posições + o caractere nulo \0.
char nome[4] = {'O', 'l', 'a', '\0'};
Cada caractere é declarado explicitamente, e o último caractere é \0.
Utilize o especificador %s para capturar uma string da entrada padrão:
char str[101];
scanf("%s", str);
Observe que no comando acima, a string pode ter até 100 caracteres e 1 caractere para armazenar o \0.
No código-fonte completo, tem-se:
#include<stdio.h>
int main(){
char str[101];
scanf("%s", str);
printf("String lida: %s\n", str);
return 0;
}
O operador & (retorna o endereço de uma variável) não é necessário no scanf ao usar o especificador %s porque o nome de um vetor de qualquer tipo já é, por si só, uma referência para o seu primeiro elemento (que está na primeira posição).
É importante salientar que scanf com o especificador %s não lê espaços em branco. Caso você digite “Athletico Paranaense” e apertar ENTER, aparecerá na saída:
String lida: Athletico
A parte remanescente Paranaense permanecerá no Buffer de Entrada e Saída aguardando ser lida por um outro comando scanf.
Caso você queira ler uma string com espaços em branco e até encontrar a quebra de linha (caractere \n), faça:
scanf("%[^\n]", str);
O caractere \n permanece no buffer:
Depois de usar %[^\n], o caractere \n ainda permanecerá no Buufer de I/O, podendo causar problemas em leituras subsequentes. Por isso, se livre desse \n por meio do comando:
getchar();
Obs.: nas versões mais antigas da Linguagem C, era comum se usar scanf("%[^\n]s", str);, mas atualmente o caractere constante s não é mais necessário, sendo ignorado pelos compiladores mais modernos, como o GCC.
Evite o estouro do Buffer de I/O: execute o código-fonte abaixo e veja o que acontece.
#include <stdio.h>
int main() {
char str1[6];
char str2[21] = "Remo e Paysandu";
scanf("%s",str1);
printf("str1: = %s\n", str1);
printf("str2: = %s\n", str2);
return 0;
}
Observe que se o usuário digitar mais caracteres do que a string str1 suporta, a memória adjacente associada à outra variável str2 será sobrescrita. Por isso, tome cuidado ao declarar o tamanho máximo de cada string. Sempre coloque o espaço de memória realmente necessário para armazenar todos os caracteres a serem lidos da entrada em uma string.
Em juízes online, como o Beecrowd, verifique nos limites das entradas do problema, o tamanho máximo que cada string pode possuir.
fgetsOutra possibilidade é utilizar a função fgets
char str[101];
fgets(str, sizeof(str), stdin);
Ela garante que não mais do que o tamanho do vetor seja lido. Além isso, ela inclui o caractere de nova linha (\n) na string, a menos que a linha lida seja maior que o espaço disponível.
sizeof é um operador que retorna a quantidade de bytes necessárias para representar todo o espaço de memória demandado pela variável str. No caso será 101 posições vezes 1 byte = 101 bytes. stdin é a abreviação de standard input - entrada padrão.