Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定argv[1]中的字符串是否以字符或数字开头(C编程)_C_String_Parameters_Argv - Fatal编程技术网

确定argv[1]中的字符串是否以字符或数字开头(C编程)

确定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

我正在用C编写一个小应用程序,它包含两个参数。一个是文件名,另一个是数字,它们可以按随机顺序指定

/主文件名12345

/main 12345文件名

两者都应该起作用


当我知道文件名以字符开头时,如何轻松确定哪个是哪个?

您可以在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);
}