0

我正在尝试转换以各种方式编写的一系列电话号码,例如:

324.323 4345
234-345-6456.

我想将它们转换成的格式是:(xxx) xxx-xxxx

这是我到目前为止的代码,不幸的是它不起作用..

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {

    FILE *fp;
    char str[31], ch;
    int i = 0, p1, p2, p3;
    fp = fopen("numbers.txt", "r");


        while((ch = getc(fp)) != '\n')
       {
 if(isdigit(ch))
                str[i++] = ch;
        str[i] = '\0';
        i = 0;

        sscanf(str, "%3d%3d%4d", &p1, &p2, &p3);
        printf("(%3d) %3d-%4d\n", p1, p2, p3);
      }
fclose(fp);
    return 0;
}

我在这里做错了什么?我知道我可能需要隔离每个整数,但这样做有问题。

只需使用以下命令运行它:

 404.817.6900
 (215)  686-1776
312-746-6000
877 275 5273
6173434200

并得到以下信息:

(  4) 4196261-32767
(  0) 4196261-32767
(  4) 4196261-32767
(  4) 4196261-32767
(  8) 4196261-32767
(  1) 4196261-32767
(  7) 4196261-32767
(  7) 4196261-32767
(  6) 4196261-32767
(  9) 4196261-32767
(  0) 4196261-32767
(  0) 4196261-32767
(  0) 4196261-32767
4

3 回答 3

2

我可能会从这样的事情开始:

if (3 == sscanf(str, "%3d%*[^0-9]%3d%8[^0-9]%4d", &p1, &p2, &p3))
    printf("(%3d) %3d-%4d\n", p1, p2, p3);

"%*[^0-9]" 部分跳过其他任何内容,直到它们到达下一个数字。

编辑:我没有注意到其中一个可能的输入根本没有数字之间的分隔。不幸的是,您不能真正将scanf' 的整数转换限制为仅读取前三位数字或类似的东西。为了解决这个问题,您几乎需要读取字符串而不是数字。为了使代码更易于理解,我还将它分成几部分,而不是尝试一次阅读所有内容,给出如下内容:

int copy_num(FILE *file, FILE *out) { 
    char p1[4], p2[4], p3[5];
    int ret=0;

    fscanf(file, "%*[^0-9]");
    ret += fscanf(file, "%3s%*[^0-9]", p1);
    ret += fscanf(file, "%3s%*[^0-9]", p2);
    ret += fscanf(file, "%4s", p3);
    if (ret == 3)
        fprintf(out, "(%3s) %3s-%4s\n", p1, p2, p3);
    return ret == 3;
}
于 2012-12-06T03:22:27.993 回答
1

这对你有用吗?它在樱桃上咬了三口,可以这么说(在最坏的情况下):

#include <stdio.h>

int main(void)
{
    char buffer[128];

    while (fgets(buffer, sizeof(buffer), stdin) != 0)
    {
        int p1, p2, p3;
        if (sscanf(buffer, "%*[^0-9]%3d%*[^0-9]%3d%*[^0-9]%4d", &p1, &p2, &p3) == 3 ||
            sscanf(buffer, "%3d%*[^0-9]%3d%*[^0-9]%4d", &p1, &p2, &p3) == 3 ||
            sscanf(buffer, "%3d%3d%4d", &p1, &p2, &p3) == 3)
            printf("(%3d) %3d-%4d from %s", p1, p2, p3, buffer);
        else
            printf("Failed to convert %s", buffer);
    }
    return(0);
}

对于您的测试数据集,我得到:

(404) 817-6900 from  404.817.6900
(215) 686-1776 from  (215)  686-1776
(312) 746-6000 from 312-746-6000
(877) 275-5273 from 877 275 5273
(617) 343-4200 from 6173434200
于 2012-12-06T06:22:46.523 回答
0

https://github.com/iziz/libPhoneNumber-iOS

下面的代码

NBPhoneNumberUtil *phoneUtil = [NBPhoneNumberUtil sharedInstance];

NSError *aError = nil;
NBPhoneNumber *myNumber = 
    [phoneUtil parse:@"6766077303" defaultRegion:@"AT" error:&aError];

if (aError == nil) {
    // Should check error
    NSLog(@"isValidPhoneNumber ? [%@]", 
        [phoneUtil isValidNumber:myNumber] ? @"YES":@"NO");
    NSLog(@"E164          : %@", [phoneUtil format:myNumber 
                                      numberFormat:NBEPhoneNumberFormatE164 
                                             error:&aError]);
    NSLog(@"INTERNATIONAL : %@", [phoneUtil format:myNumber
                                      numberFormat:NBEPhoneNumberFormatINTERNATIONAL 
                                             error:&aError]);
    NSLog(@"NATIONAL      : %@", [phoneUtil format:myNumber 
                                      numberFormat:NBEPhoneNumberFormatNATIONAL 
                                             error:&aError]);
    NSLog(@"RFC3966       : %@", [phoneUtil format:myNumber  
                                      numberFormat:NBEPhoneNumberFormatRFC3966 
                                             error:&aError]);
}
else {
    NSLog(@"Error : %@", [aError localizedDescription]);
}

会退还的

isValidPhoneNumber ? [YES]
E164          : +436766077303
INTERNATIONAL : +43 676 6077303
NATIONAL      : 0676 6077303
RFC3966       : tel:+43-676-6077303
于 2013-08-23T08:37:24.933 回答