有没有一种好方法可以限制scanf字符串的输出?如果我用一个约束测试它,那么只有一个像“.”这样的约束,它显示了我所期望的
如果(b[i]=='。)
{
printf(“c”,b[i]);
}
但一旦我尝试添加更多,它就不再限制任何东西
如果(b[i]=='.','-')
{
printf(“c”,b[i]);
}
在获得无限制输入后,是否有一个好方法来定义允许输出哪些字符
#包括<;标准h>;
int main(int argc,char*argv[])
{
charb[5];
int i;
printf(“输入字符(仅显示前5个允许的字符):”;
scanf(“s”,b);
对于(i=0;i<;5;i++)
{
如果(b[i]='.','-')
{
printf(“c”,b[i]);
}
其他的
{
i++;
}
}
printf(“\n”);
返回0;
}
如果(b[i]='.','-')
的行为类似于:
b[i]='.;//比较并忽略结果
if('-')//测试'-'是否为非零(它是)
显然不是OP想要的
反而
如果(b[i]='.|b[i]='-')//执行最多2次比较
或
if(memchr(";=";,b[i],2))//测试b[i]是否在";的2个字符中=&引用;
或
if(strchr(";=";,b[i])//测试b[i]是否在";的3个字符中=&引用;
当b[i]='\0'
时,最后一个是正确的,因此不完全相同
如果循环是for(j=0;b[j];j++
,那么当b[j]=='\0'
时,测试strchr(";,b[j])
将不会发生,然后strchr(";=";,b[j])
将是一个等价的测试
不要使用scanf(“s”,b)因为它容易缓冲区溢出。使用
fgets()
或宽度限制,如scanf(“%4s”,b)
代码还需要将用于遍历输入字符串的索引与允许的字符计数分开
#包括<;标准h>;
#包括<;字符串.h>;
内部主(空){
charb[100];
int i=0;
printf(“输入字符(仅显示前5个允许的字符):”;
if(fgets(b、b尺寸、标准尺寸)){
对于(int j=0;b[j]&;i<;5;j++){
if(strchr(";=";,b[j])){
printf(“%c”,b[j]);
i++;
}
}
}
printf(“\n”);
返回0;
}