您好,我所要做的只是将字符串转换为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/