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]」の部分は、次の桁に到達するまで他の部分をスキップします。

編集:可能な入力の1つに数字間の区切りがまったくないことに気づいていませんでした。scanf残念ながら、の整数変換を最初の3桁などの読み取りのみに制限することはできません。これに対処するには、数字ではなく文字列を読み取る必要があります。コードをもう少しわかりやすくするために、一度にすべてを読み取ろうとするのではなく、いくつかの部分に分割して、次のようにします。

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

これはあなたのために働きますか?さくらんぼに3回噛み付く、いわば(最悪の場合):

#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 に答える