【问题标题】:How to check for a 10 digit number in a string如何检查字符串中的 10 位数字
【发布时间】:2013-09-30 23:55:08
【问题描述】:

在 C 中,如何检查从文件中读取的字符串是否包含 10 位数字。我使用过 strspn 并且它似乎有效,但我认为有更好的方法。非常感谢任何帮助。

char cset[] = "1234567890";
do
{  
// read line into line_string       
} while (strspn(line_string, cset) != 10);

【问题讨论】:

  • 循环通过isdigit()for (i=0;i<strlen(line_string);i++){if(isdigit(line_string[i])j++;} printf("%d", i);。刚刚看到@LihO 的代码。喜欢他的
  • 我应该补充一下,使用没有错 strspn()。如果您注意到,您会在 1 行中得到结果,我们其他人使用更多行来做同样的事情 :) 有点取决于您是否有特定的目标。 “更好的方法”是模棱两可的

标签: c string validation formatted-input


【解决方案1】:

它应该工作。你确定你没看错line_string吗?

char cset[] = "1234567890";
char line[] = "9846578497";
printf("%d", strspn(line, cset));

输出10。显式检查每个字符的简单循环也非常简单:

int i, digits = 0;
for (i = 0; line[i] != '\0'; ++i)        // <-- make sure line is null-terminated
    if (isdigit(line[i])) digits++;
printf("%d", digits);

【讨论】:

    【解决方案2】:

    有一个更简单的方法,使用 string.h 库

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(int argc, const char *argv[])
    {
        char string[] = "0123456789";
        int stringLength = strlen(string);
        printf("%d\n", stringLength);
        return 0;
    }
    

    【讨论】:

    • 如果数字存储在一个字符中。
    • 如何通过strlen知道它是否是一个数字?它给出了字符串的长度,而不是字符串中数字的长度。跨度>
    【解决方案3】:

    这取决于你想要什么。

    让我们假设一堆不同的输入。为此,我们有:

    char cset[] = "1234567890";
    
    char str1[] = "5319764208";            /* all digits in different order */
    strspn(str1, cset);    /* returns 10 */
    char str2[] = "098765432";             /* not all digits present */
    strspn(str2, cset);    /* returns 9 */
    char str3[] = "not098a7654num321";     /* not a number, but has all digits */
    strspn(str3, cset);    /* returns 0 */
    char str4[] = "blah 1234567890 blah";  /* all digits in same order plus chars */
    strspn(str4, cset);    /* returns 0 */
    

    所以这取决于您希望接受的输入是什么。

    【讨论】:

    • 我可以有字符串,例如“blah 1234567890 blah”或“blah 3215556890 blah”或“blah 5555667890 blah”等基本上是10位数字加字符的任意组合,因此我需要立即确定是否存在该10位数字。以下代码返回 0 的事实突出了这个问题。 char str4[] = "废话 1234567890 废话"; /* 相同顺序的所有数字加上字符 / strspn(str4, cset); / 返回 0 */ 有比 strspn 更好的方法吗?鲍勃
    【解决方案4】:

    是的,有很多有效的方法,但这取决于您将如何在程序中使用它们。有一些命令取决于您的使用环境,您可以阅读“strncmp”和“strstr”。 如果你想比较行首的字符串,你可以使用strncmp这里是例子。

    #define VALID_STRING "  <project"
    #define COMPARELIMIT 10
    
    if(!strncmp(linebuffer, VALID_STRING, COMPARELIMIT)) {
    // your code goes here
    
    }
    else {
    
    }
    

    如果您想在行缓冲区中的任何其他点进行比较,请使用“strstr”

    #define CHECK_STRING "name="
        char *start=NULL; 
        start=strstr(linebuffer, CHECK_STRING);
        // it returns the address pointing to the first character of that(CHECK_STRING) string any where in linebuffer.
    

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 2018-12-22
      • 2015-08-28
      • 2012-08-16
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2011-11-28
      • 2015-05-29
      相关资源
      最近更新 更多