0

您好,我要做的只是将scanf字符串转换为 2 个结构变量,但是在运行代码时,它只是通过scanf(它们两个)并转到printf.

我的代码如下:

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);
}
4

3 回答 3

4

问题是格式字符串中的空格(包括换行符)scanf()表现得特别 - 它意味着任意序列的空格字符。

当它提示时Nome:,您可以键入名称(“亚历山大大帝”)和换行符,但会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()读取该行并sscanf()对其进行解析;这通常效果更好。

于 2013-06-13T16:54:13.353 回答
0

您是否尝试读取 60 个字符并在scanf语句中以 59 表示?那么,你scanf错了。将其更改为:scanf ( "%s", novo->nome );它应该可以工作。与其他相同scanf

于 2013-06-13T16:43:21.680 回答
-1

这是一个完整的示例,从标准输入读取两个字符串,然后使用 sscanf 删除尾随的换行符并打印它们:

#include <stdio.h>

struct {
    char first[60];
    char second[60];
} store;

int main(int argc, char ** argv) {
    char buffer[60];

    printf("write something: ");
    fgets(buffer, 60, stdin);
    sscanf(buffer, "%s", store.first);

    printf("write something else: ");
    fgets(buffer, 60, stdin);
    sscanf(buffer, "%s", store.second);

    printf("you wrote: %s then %s\n", store.first, store.second);

    return 0;
}
于 2013-06-13T16:44:34.010 回答