C - 使用字符串,并使用连字符分隔符解析/标记为较小的字符串

时间:2013-05-27 20:52:31

标签: c string delimiter split hyphen

我被困在家庭作业上。没有急,我有足够的时间来完成这个。我一直在论坛漫游(看起来像一个论坛大声笑),并非常感谢这里的知识和社区意识。我已经从其他人的恩典中应用了许多技巧,他们回答了这些noob问题。

无论如何,我的任务是编写一个带有字符串的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;
}

3 个答案:

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

答案 1 :(得分:0)

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

答案 2 :(得分: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]之类的内容。对我来说,过滤序列号输入的最好方法是Regex(如果可用的话)......但我不认为这是你作业的一部分:)