2013-05-27 51 views
0

我被困在我的家庭作业中。没有急于,我有足够的时间来完成这一点。我一直在漫游论坛(看起来像一个论坛哈哈),并一直非常感谢这里的社区的知识和意识。我已经从其他回答这些noob问题的人的恩典中应用了许多技术。C - 取一个字符串,并使用连字符分隔符解析/标记为较小的字符串

无论如何,我的任务是编写一个ac程序,该程序需要一个带连字符的字符串,并检查第一个字符串(在连字符之前)是否只有字母/字母,下一个组是仅数字,最后一组仅为字母/字母。这是类似于这个项目:http://wps.aw.com/wps/media/objects/7257/7431666/Case_Studies/GaddisJavaCSO_CS6.pdf

到目前为止,我坚持把字符串分成3个变量。我已阅读有关的strtok和操纵scanf函数,但我一直没成功:

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

int main() 
{ 
char serial [50]; 
char * part1 = NULL, part2 = NULL, part3 = NULL; 
    printf("Enter Serial Number:\n"); 
    scanf("%s", serial); 
part1 = strtok (serial, "-"); 

part2 = strtok(NULL, "-"); 
part3 = strtok(NULL, "-"); 

    printf("You entered %s\n", part1); 
    printf("You entered %s\n", part2); 
    printf("You entered %s\n", part3); 
return 0; 
} 
+0

'*'不是数据类型的一部分,我想你想写'char * part1 = NULL,* part2 = NULL,* part3 = NULL;' – Johannes

回答

1

您使用strtok的错误,向它传递参数,它应该工作的罚款。

char * pch = strtok (serial, "-"); 
while (pch != NULL) 
{ 
    printf ("%s\n",pch); 
    pch = strtok (NULL, "-"); 
} 

或在您的例子中,你需要在每个定义为一个char *:

char * part1= strtok (serial, "-"); 
    char * part2 = strtok(NULL, "-"); 
    char* part3 = strtok(NULL, "-") 

StrTok + example

+0

Dory Zidon - 你的strtok用于分裂第一组,但是我得到了第二/第三组不可移植的指针转换错误。我究竟做错了什么? – Nixnexus

+0

@Nixneuxs - 你需要将每个poat定义为一个char *,否则它是一个char而不是char * ...或者我如何在编辑的例子中显示或者在每个var前面使用指针表示法。 –

+0

哇我现在感觉很愚蠢。非常感谢你Dory Zidon ... – Nixnexus

0
strcpy(part1, strtok(serial, "-"));//premise: string has hyphen 
strcpy(part2, strtok(NULL, "-")); 
strcpy(part3, strtok(NULL, "-")); 
0

你可以利用scanf的格式规则的直接读取你的字符串输入行。

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

int main() 
{ 
    char part1[40], part2[40], part3[40]; 
    int count, n; 
    do{ 
     n = 0; 
     flushall(); 
     printf("Enter Serial Number:\n"); 
     count = scanf(" %39[A-Za-z]-%39[0-9]-%39[A-Za-z]%n", part1, part2, part3, &n); 
     if(count != 3 || n == 0){ 
      printf("Recognize %i parts, %s\n", count, n == 0 ? "did not parse to the end" : "parsed to the end"); 
     } 
    }while(count != 3 || n == 0); 

    printf("You entered %s\n", part1); 
    printf("You entered %s\n", part2); 
    printf("You entered %s\n", part3); 
return 0; 
} 

这是相当严格的解析输入形式,并要求用户保留外部形式。您可以通过不使用%s而是像%[0-9]那样容易地过滤允许的字符串。对我来说,过滤serialnumber输入的最好方法是总是正则表达式,如果可用......但我不认为这是你的功课的一部分:)

+0

这听起来超级先进哈哈。看起来你定义了密钥的每个部分有40个字符......非常感谢你的回应,并给我一个未来任务的提示。我看到Regex在开始一个新线程之前提到了很多次试图缩小答案 – Nixnexus

+0

限制字符串是一件安全事情。否则,您可能会溢出字符串缓冲区,因为scanf无法测量char指针后面的缓冲区大小。您也可以使用它来限制零件的尺寸。如果你想用正则表达式来摆弄一下,你可以使用这样一个在线正则表达式测试器:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx – Johannes

相关问题