用C语言标记电话号码
我试图标记一个电话号码并将其分成两个数组。它以字符串形式开始,格式为“(515)555-5555”。我想标记区号,前3位和后4位。我将把区号存储在一个数组中,其他7位数字存储在另一个数组中。两个数组只保存数字本身 我的代码似乎有效。。。某种程度上。问题是当我打印这两个存储阵列时,我发现了一些怪癖用C语言标记电话号码,c,string,tokenize,C,String,Tokenize,我试图标记一个电话号码并将其分成两个数组。它以字符串形式开始,格式为“(515)555-5555”。我想标记区号,前3位和后4位。我将把区号存储在一个数组中,其他7位数字存储在另一个数组中。两个数组只保存数字本身 我的代码似乎有效。。。某种程度上。问题是当我打印这两个存储阵列时,我发现了一些怪癖 我的数组aCode它按照我的要求存储前3位数字,但随后它还打印一些在末尾有缺口的垃圾值。我在调试器中遍历了它,数组只存储我要求它存储的内容——515。那它为什么要打印那些垃圾值呢?有什么好处 我的数组a
aCode代码>它按照我的要求存储前3位数字,但随后它还打印一些在末尾有缺口的垃圾值。我在调试器中遍历了它,数组只存储我要求它存储的内容——515。那它为什么要打印那些垃圾值呢?有什么好处
aNum
;我可以将我需要的标记附加到它的末尾,唯一的问题是我在前面有一个额外的空间(这是有意义的;我添加到一个空数组,即添加到空空间)。我修改了代码,使其只包含7个变量,只是为了搞乱,我进入了调试器,它告诉我数组包含了空的空格和我需要的6个数字,没有空间容纳最后一个。然而,当我打印它时,空格和所有7位数字都被打印出来了。这是怎么发生的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上另外,有关完整的无bug代码,请参阅其他答案。我主要看到两个错误
3
char
s的数组,aCode
在这里不以null结尾。将其用作printf()
中%s
格式说明符的参数调用。同样的事情也以不同的方式出现在aNum上另外,有关完整的无bug代码,请参阅其他答案。您的代码存在多个问题
aCode
分配了错误的大小,则应为nul
终止符字节添加1,并将整个数组初始化为“\0”,以确保行结束
char aCode[4] = {'\0'};
strtok()
是否返回NULL
numPtr = strtok(phoneNum, " ");
strncpy(aCode, &numPtr[1], 3);
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);
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
答案也是最干净的