2014-01-22 108 views
0

我知道使用scanffgets的区别和优势/劣势。“scanf with printf”vs“fgets with printf”

我不明白printf和这两个C标准函数之间的关系。

我有这个简单的代码:

void print_choice(char * list, char * choice) 
{ 
    /* check parameters */ 
    if(!list || !choice) 
    return; 

    printf("list of users: %s\n", list); 
    printf("Choice -- ? "); 

    /* scanf("%s", &choice); */ 
    /* fgets(choice, 20, stdin); */ 

} 


int main() 
{ 
    char choice[20]; 
    char * list = "marco:dario:roberto:franco"; 

    print_choice(list, choice); 
    printf("choice = %s\n", choice); 

    return 0; 
} 

如果我使用fgets的printf正确打印在标准输出结果;

如果我使用scanf,printf`不会在stdout上打印任何内容。

为什么会这样?

+0

您需要fflush((stdout)在printf之后使用 – cup

+0

作为_scanf(“%s”,选择); _ << - Notice dropped'&' –

回答

3

您使用的scanf("%s", &choice);当它期望char *时通过char **scanf()

删除&

如果你的编译器没有抱怨,你要么没有打开足够的警告,要么你需要更好的编译器。

+0

与“如果您的编译器不抱怨” – chux

+0

Oh sh .. !!对不起,这个愚蠢的错误!!谢谢! – Kyrol

1

变化

scanf("%s", &choice); 

scanf("%s", choice); 
1

,你必须使用

scanf("%s", choice); 

,而不是

scanf("%s", &choice); 
0

scanf("%s", &choice);更改为scanf("%s", choice);将导致scanf和fgets显示几乎相似的行为。

scanf需要地址作为参数。它继续并根据提供的格式说明符转换它之后存储stdin的输入。这里的格式说明符是%s,因此它会尝试将输入存储在选择地址指向的地址处。这里你需要的是选择数组从何处开始的地址,在这种情况下本身就是选择。