【问题标题】:Determine if string from argv[1] starts with a character or number (C-programming)确定 argv[1] 中的字符串是否以字符或数字开头(C 编程)
【发布时间】:2009-11-07 16:43:11
【问题描述】:

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

./主文件名 12345

./main 12345 文件名

两者都应该工作。

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

【问题讨论】:

  • 如果文件名是数字?
  • 我猜在这种情况下,你必须使用第二种语法,否则你会混淆程序:)
  • 正如我所写:文件名以字符开头。
  • 为什么不要求参数按特定顺序排列?这就是大多数程序所做的,否则就不可能确定参数。大多数程序确实必须处理数字文件名。
  • 如何处理以破折号开头的文件名?还是一美元?亚当,你应该让你的评论成为答案。

标签: c string parameters argv


【解决方案1】:

您可以在argv[1]argv[2] 的第一个字符上使用isalphaisdigit 函数(在ctype.h 中定义)。

【讨论】:

  • 如果您的文件名是合法数字,那么每个此类解决方案的主要问题都会出现。所以你必须检查整个字符串是否只包含一个数字,然后如果它不存在文件。
  • @frenetisch,这不是这个答案的问题,而是问题本身。而且这个问题甚至都不是问题,因为 OP 声明所有文件名都以字符开头。
【解决方案2】:

您可以使用 ctype 函数。

if (isalpha(*argv[1]))
    // argv[1] starts with a letter
else if (isdigit(*argv[1])
    // argv[1] starts with a number

【讨论】:

  • 别忘了处理else 的情况..../main /path/to/file 666。仅使用 isdigit(),否则假定文件名可能会更好。
  • 您应该将*argv[1] 转换为unsigned char,因为它的类型是char,并且isalphaisdigit 指定它们的参数必须在unsigned char 的范围内或EOF.
【解决方案3】:

使用isdigit

isdigit((unsigned char)argv[1][0])

请务必先检查argc

【讨论】:

    【解决方案4】:
    if ('0' <= argv[1][0] && argv[1][0] <= '9')
    {
        /* it starts with a number */
    }
    

    【讨论】:

      【解决方案5】:

      也可以使用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] 是以字符开头的字符串,则第一个子句将返回“零”。

      【讨论】:

      • 这种情况下不需要复制字符串,你可以根据需要将string直接赋值给argv[1] or argv[2]`。
      • 你说得对,亚当,他们在同一个范围内。感谢您指出这一点。
      猜你喜欢
      • 2013-05-13
      • 2012-01-22
      • 2014-01-15
      • 2023-01-01
      • 1970-01-01
      • 2011-04-18
      • 2022-11-30
      • 1970-01-01
      • 2018-01-31
      相关资源
      最近更新 更多