我有这个功能,检查输入是否类似于d1,d7,d65,
等 - 意味着它以“d”开头,然后有一个数字。
我想检查一下它的结构,然后返回之后的数字。
最有效的方法是什么?可以仅使用scanf
完成吗?
答案 0 :(得分:2)
您可以使用sscanf
并检查返回值,如果它返回1则表示已成功读取整数(通过%d
) - 并且符合您需要的格式;否则t
没有所需的格式。
int read_fmt( char t[], int *n )
{
return sscanf( t, "d%d", n );
}
int main ()
{
char t[] = "d8787";
int n = 0;
if( read_fmt( t, &n ) == 1 )
{
printf( "correct format, n = %d\n", n );
}
else
{
perror( "incorrect format\n" );
}
}
答案 1 :(得分:0)
由于结构很简单,一些简单的检查和控制应该可以做到这一点,例如:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
const char* input = "d1,d7,d65,d171";
bool error = false;
const char* ptr = input;
while (*ptr != '\0')
{
// not starting with d so break with failure
if (*ptr != 'd') { error = true; break; }
// we must find a sequence of "number,..." or "number\0"
else
{
// not any character available, break with failure
if (++ptr == '\0') { error = true; break; }
else
{
int v = strtol(ptr, &ptr, 10);
// add error check for strtol
printf("found: %d\n", v);
// skip comma
if (*ptr && *ptr == ',') ++ptr;
}
}
}
printf("error = %d\n", error);
但是你必须处理所有各种边缘情况以确保正确的行为。