您好,我所要做的只是将字符串转换为2个结构变量,但是在运行代码时,它只需传递scanf(两个变量)并转到scanf
我的代码如下:

struct s_Especialidade{
    char nome[60];
    char descricao[60];
    struct s_Especialidade *proximo;
};

typedef struct s_Especialidade Especialidade;
typedef Especialidade *PESPECIALIDADE;

void novaEspecialidade()
{
    PESPECIALIDADE novo = malloc(sizeof(Especialidade) );
    int opcao=0;
    printf("\nNome: ");
    scanf("%59[^\n]\n", (novo->nome));
    printf("\nDescricao: ");
    scanf("%59[^\n]\n", (novo->descricao));
    novo->proximo = NULL;
    printf("\n%s - %s",novo->nome, novo->descricao);
}

最佳答案

问题在于scanf()格式字符串中的空白(包括换行符)的行为特别——它意味着空白字符的任意序列。
当它提示Nome:时,您可以键入名称('Alexander the Great')和换行符,但scanf()会一直读取,直到遇到另一个不是空白的字符。因此,您可以键入“亚洲征服者”,然后出现提示Descricao:,它将读取,直到您键入另一个非空白字符,然后它将终止。
例如:

$ ./name-prompt
Nome: Alexander The Great
Conqueror of Asia

Descricao: a

<<Alexander The Great>> - <<Conqueror of Asia>>
$

这是代码:
#include <stdio.h>
#include <stdlib.h>

struct s_Especialidade{
    char nome[60];
    char descricao[60];
    struct s_Especialidade *proximo;
};

typedef struct s_Especialidade Especialidade;
typedef Especialidade *PESPECIALIDADE;

static
void novaEspecialidade(void)
{
  PESPECIALIDADE novo = malloc(sizeof(Especialidade) );
  printf("\nNome: ");
  if (scanf("%59[^\n]\n", (novo->nome)) != 1)
      printf("Oh, bother!\n");
  printf("\nDescricao: ");
  if (scanf("%59[^\n]\n", (novo->descricao)) != 1)
      printf("Oh, bother!\n");
  novo->proximo = NULL;
  printf("\n<<%s>> - <<%s>>\n", novo->nome, novo->descricao);
  free(novo);
}

int main(void)
{
  novaEspecialidade();
  return 0;
}

注意printf()输出以换行结束;这通常是一个好主意。
要解决此问题,请将scanf()格式修改为:
"%59[^\n]"

scanf()之后,执行以下等效操作:
int c;
while ((c = getchar()) != EOF && c != '\n')
    ;

把它打包成一个函数-可能gobble()read_to_newline()
或者使用fgets()读取行并解析它;这样通常效果更好。

关于c - scanf无法识别%59 [^\n],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17092497/

10-12 07:36
查看更多