关于while循环的输入终止条件情况

引入问题:统计数字个数

接收输入的一行字符,统计出字符串中包含数字的个数。
输入格式:
输入一行任意的字符串,可以包含包含数字、字母和特殊字符,也可以不包括
输出格式:
输出输入字符串中数字的个数

输入样例1:
在这里给出一组输入。例如:
hello

输出样例1:
在这里给出相应的输出。例如:
0

现给出2种方法:
1.

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

 int main(){
   char s[100];
   int i=0,b=0;
   gets(s);
   while (s[i]!='\0'){                //注意
        i++;
    if (s[i]>=48 && s[i]<=57){
   b++;
   }
   }
   printf("%d",b);
   return 0;

}
2.

#include <stdio.h>
int main()
{
    char c;
    int digit=0;
    while ((c=getchar())!=EOF)                 //注意
    {
        if (c >= '0' && c <= '9'){
            digit++;
        }
}
    printf("%d",digit);
    return 0;
}

为什么两种方法里while的循环终止条件不同,且不能互换,s[i]的'\0'要是换成了EOF显示答案错误,getchar()的EOF要是换成了'\0'显示运行超时
由此引起了对while循环终止条件的思考,在一些要连续输入直到满足特定条件才跳出循环。
问下都有哪些符号或者常量等经常被用作连续输入循环判断语句里的终止条件?
'\n'可以用作终止符吗?(潜意识里总是会先打个'\n'试试)最好有具体例子

\0不等于EOF,\0的ascii码值是0,EOF是文件结束符
gets(s)从键盘读取一串字符串,并以\0结束,这是函数的功能。
c=getchar()从键盘读取单个字符,\0无法通过键盘输入,但是EOF可以通过ctrl+z组合键来模拟输入。
所以两者不能互换。
另外,你代码一中,第9行的i++应该放在if语句下面。

gets读取字符串时,是以换行为结束标志的,结束时自动给字符串末尾增加了'\0'结尾符号,所以用gets后,你对字符串检查只需要看'\0'就可以了
getchar是读入字符,任何输入都是字符,无论回车、换行、空格等控制符。EOF表示输入结束,EOF的值是-1,你只能通过输入组合键CTRL+Z完成