printf()的意外行为

时间:2016-02-02 21:49:08

标签: c printf

我尝试在C中使用函数进行练习,因为我设法在C ++中使用递归函数,所以这里是我的代码:

a

奇怪的是输出如下:

#include <stdio.h>
#include <stdlib.h>

int Fctr(int n)
{
    return (n <= 1) ? 1 : n * Fctr(n -1);
}

int main(int argc, char** argv)
{
    char s_n[100];
    int i_n;

    printf("Factorial to calculate : ");
    fgets(s_n, 100, stdin);

    i_n = atoi(s_n);

    printf("The factorial of %s is equal to %d\n",s_n, Fctr(i_n));

    return 0;
}

我使用GCC 5.3.0使用以下命令编译:

Factorial to calculate : 5
The factorial of 5
 is equal to : 120

我甚至没有在%s和我的其余代码之间键入\ n。我的第二个printf()有什么问题?我尝试使用%c代替%s,即使这是一个坏主意,确实是......

1 个答案:

答案 0 :(得分:4)

摘自我电脑上的ant -Dadb.device.arg='-s emulator-5554' installd

  

fgets()从流和中读取最多一个小于大小的字符   将它们存储到s指向的缓冲区中。读后停止了   EOF或换行符。 如果读取换行符,则将其存储到缓冲区。   终止空字节('\ 0')存储在最后一个字符之后   缓冲区。

这就是发生的事情。您必须自行检查换行并将其删除,最好用ASCII NUL(0或'\ 0')替换它。