确定argv[1]中的字符串是否以字符或数字开头(C编程)
我正在用C编写一个小应用程序,它包含两个参数。一个是文件名,另一个是数字,它们可以按随机顺序指定 /主文件名12345 及 /main 12345文件名 两者都应该起作用确定argv[1]中的字符串是否以字符或数字开头(C编程),c,string,parameters,argv,C,String,Parameters,Argv,我正在用C编写一个小应用程序,它包含两个参数。一个是文件名,另一个是数字,它们可以按随机顺序指定 /主文件名12345 及 /main 12345文件名 两者都应该起作用 当我知道文件名以字符开头时,如何轻松确定哪个是哪个?您可以在argv[1]或argv[2]的第一个字符上使用ctype.h中定义的isalpha和isdigit函数。您可以使用ctype函数 if ('0' <= argv[1][0] && argv[1][0] <= '9') { /* i
当我知道文件名以字符开头时,如何轻松确定哪个是哪个?您可以在argv[1]或argv[2]的第一个字符上使用ctype.h中定义的isalpha和isdigit函数。您可以使用ctype函数
if ('0' <= argv[1][0] && argv[1][0] <= '9')
{
/* it starts with a number */
}
if (isalpha(*argv[1]))
// argv[1] starts with a letter
else if (isdigit(*argv[1])
// argv[1] starts with a number
使用isdigit
确保首先选中argc。您还可以使用sscanf函数,该函数返回成功扫描的项目数:
int number;
char *string;
if (sscanf (argv[1], " %d ", &number) == 1) { /*12345 filename */
string = malloc ((strlen (argv[2]) + 1) * sizeof (char));
sscanf (argv[2], " %s ", string);
}
else { /* filename 12345 */
sscanf (argv[2], " %d ", &number);
string = malloc ((strlen (argv[1]) + 1) * sizeof (char));
sscanf (argv[1], " %s ", string);
}
如果argv[1]是以字符开头的字符串,则第一个子句将返回零 如果文件名是一个数字?我想在这种情况下,您必须使用第二种语法,否则会混淆程序:正如我所写的:文件名以字符开头。为什么不要求参数按特定顺序排列呢?大多数程序都是这样做的,否则就无法确定参数。大多数程序都必须处理以数字开头的文件名。对于以破折号开头的文件名,你该怎么办?还是一美元?亚当,你应该把你的评论作为一个答案。像这样的解决方案的主要问题是如果你有一个合法的文件名。因此,如果整个字符串只包含一个数字,则必须检查整个字符串,如果该字符串不存在文件,则必须检查整个字符串。@frenetisch,这不是这个答案的问题,而是问题本身的问题。这个问题甚至没有问题,因为OP声明所有文件名都以一个字符开头。不要忘记处理else的情况/main/path/to/file 666。仅使用isdigit,并假定文件名不是这样可能更好。您应该将*argv[1]强制转换为unsigned char,因为它是char类型,并且isalpha和isdigit指定其参数必须在unsigned char或EOF范围内。在这种情况下,不需要复制字符串,您可以直接将字符串分配给argv[1]或argv[2]`你说得对,亚当,他们在同一范围内。谢谢你指出这一点。
int number;
char *string;
if (sscanf (argv[1], " %d ", &number) == 1) { /*12345 filename */
string = malloc ((strlen (argv[2]) + 1) * sizeof (char));
sscanf (argv[2], " %s ", string);
}
else { /* filename 12345 */
sscanf (argv[2], " %d ", &number);
string = malloc ((strlen (argv[1]) + 1) * sizeof (char));
sscanf (argv[1], " %s ", string);
}