Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
用C语言标记电话号码_C_String_Tokenize - Fatal编程技术网

用C语言标记电话号码

用C语言标记电话号码,c,string,tokenize,C,String,Tokenize,我试图标记一个电话号码并将其分成两个数组。它以字符串形式开始,格式为“(515)555-5555”。我想标记区号,前3位和后4位。我将把区号存储在一个数组中,其他7位数字存储在另一个数组中。两个数组只保存数字本身 我的代码似乎有效。。。某种程度上。问题是当我打印这两个存储阵列时,我发现了一些怪癖 我的数组aCode它按照我的要求存储前3位数字,但随后它还打印一些在末尾有缺口的垃圾值。我在调试器中遍历了它,数组只存储我要求它存储的内容——515。那它为什么要打印那些垃圾值呢?有什么好处 我的数组a

我试图标记一个电话号码并将其分成两个数组。它以字符串形式开始,格式为“(515)555-5555”。我想标记区号,前3位和后4位。我将把区号存储在一个数组中,其他7位数字存储在另一个数组中。两个数组只保存数字本身

我的代码似乎有效。。。某种程度上。问题是当我打印这两个存储阵列时,我发现了一些怪癖

  • 我的数组
    aCode它按照我的要求存储前3位数字,但随后它还打印一些在末尾有缺口的垃圾值。我在调试器中遍历了它,数组只存储我要求它存储的内容——515。那它为什么要打印那些垃圾值呢?有什么好处

  • 我的数组
    aNum
    ;我可以将我需要的标记附加到它的末尾,唯一的问题是我在前面有一个额外的空间(这是有意义的;我添加到一个空数组,即添加到空空间)。我修改了代码,使其只包含7个变量,只是为了搞乱,我进入了调试器,它告诉我数组包含了空的空格和我需要的6个数字,没有空间容纳最后一个。然而,当我打印它时,空格和所有7位数字都被打印出来了。这是怎么发生的

  • 我如何设置strtok函数,让它先复制“-”前面的3位数字,然后再附加我需要的最后4位数字?我见过的所有标记化示例都使用while循环,这意味着我必须选择
    strcat
    strcpy
    来完成任务。我可以设置一个“if”语句,每次检查当前令牌的大小,但这对我来说太粗糙了,我觉得有一个更简单的方法。谢谢大家

    int main() {
    
        char phoneNum[]= "(515) 555-5555";
        char aCode[3];
        char aNum[7];
    
        char *numPtr;
    
        numPtr = strtok(phoneNum, " ");
    
        strncpy(aCode, &numPtr[1], 3);
        printf("%s\n", aCode);  
    
        numPtr = strtok(&phoneNum[6], "-");
    
        while (numPtr != NULL) {
            strcat(aNum, numPtr);
            numPtr = strtok(NULL, "-");
        }
        printf("%s", aNum);  
    }
    

    我主要看到两个错误

  • 作为
    3
    char
    s的数组,
    aCode
    在这里不以null结尾。将其用作
    printf()
    %s
    格式说明符的参数调用。同样的事情也以不同的方式出现在aNum上

  • 两个参数都需要以null结尾的数组<代码>aNum不以null结尾,首次使用时也会导致UB。始终初始化局部变量


  • 另外,有关完整的无bug代码,请参阅其他答案。

    我主要看到两个错误

  • 作为
    3
    char
    s的数组,
    aCode
    在这里不以null结尾。将其用作
    printf()
    %s
    格式说明符的参数调用。同样的事情也以不同的方式出现在aNum上

  • 两个参数都需要以null结尾的数组<代码>aNum不以null结尾,首次使用时也会导致UB。始终初始化局部变量


  • 另外,有关完整的无bug代码,请参阅其他答案。

    您的代码存在多个问题

  • 如果为
    aCode
    分配了错误的大小,则应为
    nul
    终止符字节添加1,并将整个数组初始化为“\0”,以确保行结束

    char aCode[4] = {'\0'};
    
  • 不检查
    strtok()
    是否返回
    NULL

    numPtr = strtok(phoneNum, " ");
    strncpy(aCode, &numPtr[1], 3);
    
  • 第1点,适用于
    strcat(aNum,numpr)
    中的
    aNum
    ,它也将失败,因为
    aNum
    在第一次调用时尚未初始化

  • strtok()
    的后续调用必须将
    NULL
    作为第一个参数,因此

    numPtr = strtok(&phoneNum[6], "-");
    
    这是错误的,应该是错误的

    numPtr = strtok(NULL, "-");
    

  • 您的代码有多个问题

  • 如果为
    aCode
    分配了错误的大小,则应为
    nul
    终止符字节添加1,并将整个数组初始化为“\0”,以确保行结束

    char aCode[4] = {'\0'};
    
  • 不检查
    strtok()
    是否返回
    NULL

    numPtr = strtok(phoneNum, " ");
    strncpy(aCode, &numPtr[1], 3);
    
  • 第1点,适用于
    strcat(aNum,numpr)
    中的
    aNum
    ,它也将失败,因为
    aNum
    在第一次调用时尚未初始化

  • strtok()
    的后续调用必须将
    NULL
    作为第一个参数,因此

    numPtr = strtok(&phoneNum[6], "-");
    
    这是错误的,应该是错误的

    numPtr = strtok(NULL, "-");
    

  • 代码中最大的问题是未定义的行为:因为要将一个三字符常量读入一个三字符数组,所以没有为空终止符留下任何空间

    由于您正在以固定长度的非常特定的格式标记一个值,因此可以使用使用
    sscanf
    的非常简洁的实现:

    char *phoneNum = "(515) 555-5555";
    char aCode[3+1];
    char aNum[7+1];
    sscanf(phoneNum, "(%3[0-9]) %3[0-9]-%4[0-9]", aCode, aNum, &aNum[3]);
    printf("%s %s", aCode, aNum);
    
    此解决方案将格式
    (#########-####
    直接传递到
    sscanf
    ,并告诉函数每个值需要放置的位置。上面使用的唯一“技巧”是传递最后一个参数的
    &aNum[3]
    ,指示
    sscanf
    将第三段的数据与第二段的数据放在同一个存储器中,但从位置3开始


    代码中最大的问题是未定义的行为:因为您正在将一个三字符常量读入一个三字符数组,所以没有为空终止符留下任何空间

    由于您正在以固定长度的非常特定的格式标记一个值,因此可以使用使用
    sscanf
    的非常简洁的实现:

    char *phoneNum = "(515) 555-5555";
    char aCode[3+1];
    char aNum[7+1];
    sscanf(phoneNum, "(%3[0-9]) %3[0-9]-%4[0-9]", aCode, aNum, &aNum[3]);
    printf("%s %s", aCode, aNum);
    
    此解决方案将格式
    (#########-####
    直接传递到
    sscanf
    ,并告诉函数每个值需要放置的位置。上面使用的唯一“技巧”是传递最后一个参数的
    &aNum[3]
    ,指示
    sscanf
    将第三段的数据与第二段的数据放在同一个存储器中,但从位置3开始


    其他答案已经提到了主要问题,即
    aCode
    aNum
    中没有足够的空间用于终止NUL字符。对于索尔文来说,
    sscanf
    答案也是最干净的