我正在尝试转换以各种方式编写的一系列电话号码,例如:
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
答案 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)
代码
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