Lendo string de input com caractere de espaço?

Estou usando o Ubuntu e também estou usando Geany e CodeBlock como meu IDE. O que estou tentando fazer é ler uma string (como "Barack Obama" ) e colocar em uma variável:

 #include  int main(void) { char name[100]; printf("Enter your name: "); scanf("%s", name); printf("Your Name is: %s", name); return 0; } 

Saída:

 Enter your name: Barack Obama Your Name is: Barack 

Como posso fazer o programa ler o nome completo?

Usar:

 fgets (name, 100, stdin); 

100 é o comprimento máximo do buffer. Você deve ajustá-lo conforme sua necessidade.

Usar:

 scanf ("%[^\n]%*c", name); 

O [] é o caractere de varredura. [^\n] informa que, embora a input não seja uma nova linha ( '\n' ), insira a input. Então, com o %*c ele lê o caractere de nova linha do buffer de input (que não é lido), e o * indica que esta input é descartada (supressão de atribuição), pois você não precisa dela, e essa nova linha no O buffer não cria nenhum problema para as próximas inputs que você pode tomar.

Leia aqui sobre a varredura e os operadores de supressão de atribuição .

Note que você também pode usar gets mas ….

Nunca use gets() . Como é impossível dizer sem saber os dados antecipadamente quantos caracteres ficam (), e porque gets() continuará armazenando caracteres após o final do buffer, é extremamente perigoso usar. Foi usado para quebrar a segurança do computador. Use fgets() vez disso.

Tente isto:

 scanf("%[^\n]s",name); 

\n apenas define o delimitador para a string digitalizada.

Aqui está um exemplo de como você pode obter input contendo espaços usando a function fgets .

 #include  int main() { char name[100]; printf("Enter your name: "); fgets(name, 100, stdin); printf("Your Name is: %s", name); return 0; } 
 scanf(" %[^\t\n]s",&str); 

str é a variável da qual você está obtendo a string.

 #include int main() { char name[100]; printf("Enter your name: "); scanf("%[^\n]s",name); printf("Your Name is: %s",name); return 0; } 

NOTA: Ao usar fgets (), o último caractere na matriz será ‘\ n’ às vezes que você usar fgets () para pequenas inputs na CLI (interpretador de linha de comando), ao finalizar a string com ‘Enter’. Então, quando você imprimir a string, o compilador sempre irá para a próxima linha ao imprimir a string. Se você quiser que a string de input tenha um comportamento semelhante a uma string terminada com nulo, use este hack simples.

 #include int main() { int i,size; char a[100]; fgets(a,100,stdin);; size = strlen(a); a[size-1]='\0'; return 0; } 

Atualização: atualizada com a ajuda de outros usuários.

Usando este código você pode levar até pressionar o teclado.

 char ch[100]; int i; for (i = 0; ch[i] != '\n'; i++) { scanf("%c ", &ch[i]); } 
 #include  // read a line into str, return length int read_line(char str[]) { int c, i=0; c = getchar(); while (c != '\n' && c != EOF) { str[i] = c; c = getchar(); i++; } str[i] = '\0'; return i; } 

"%s" lerá a input até que o espaço em branco seja atingido.

Obtém pode ser um bom lugar para começar se você quiser ler uma linha (ou seja, todos os caracteres, incluindo espaços em branco, até que um caractere de nova linha seja alcançado).

“Barack Obama” tem um espaço entre “Barack” e “Obama”. Para acomodar isso, use este código;

 #include  int main() { printf("Enter your name\n"); char a[80]; gets(a); printf("Your name is %s\n", a); return 0; } 

A resposta correta é esta:

 #include  int main(void) { char name[100]; printf("Enter your name: "); // pay attention to the space in front of the % //that do all the trick scanf(" %[^\n]s", name); printf("Your Name is: %s", name); return 0; } 

Esse espaço na frente de% é muito importante, porque se você tiver em seu programa outro scanf digamos que você tem 1 scanf de um valor inteiro e outro scanf com um valor duplo … quando você chegar ao scanf para seu char (string nome) esse comando será pulado e você não poderá inserir valor para ele … mas se colocar esse espaço na frente de% ficará tudo ok e não pulará nada.

Enquanto os methods acima mencionados funcionam, cada um tem seus próprios problemas.

Você pode usar getline() ou getdelim() , se você estiver usando uma plataforma suportada pelo posix. Se você estiver usando o windows e o minigw como seu compilador, ele deverá estar disponível.

getline() é definido como:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

Para receber informações, primeiro você precisa criar um ponteiro para o tipo char.

 #include  #include // s is a pointer to char type. char *s; // size is of size_t type, this number varies based on your guess of // how long the input is, even if the number is small, it isn't going // to be a problem size_t size = 10; int main(){ // allocate s with the necessary memory needed, +1 is added // as its input also contains, /n character at the end. s = (char *)malloc(size+1); getline(&s,&size,stdin); printf("%s",s); return 0; } 

Exemplo de input: Hello world to the world!

Saída: Hello world to the world!\n

Uma coisa a notar aqui é que, embora a memory alocada para s seja de 11 bytes, onde o tamanho da input é de 26 bytes, o getline realoca s usando realloc() .

Portanto, não importa quanto tempo sua input é.

size é atualizado com no.of bytes de leitura, conforme o size input da amostra acima será de 27 .

getline() também considera \n como input. Assim, o seu ‘s’ irá manter ‘\ n’ no final.

Há também uma versão mais genérica de getline() , que é getdelim() , que recebe mais um argumento extra, que é delimiter .

getdelim() é definido como:

ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);

Página man do Linux

 scanf("%s",name); 

use & com a input scanf