将电话号码从文件转换为新格式

时间:2012-12-06 03:18:28

标签: c io

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

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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

答案 2 :(得分: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