【问题标题】:splitting strings with C用 C 分割字符串
【发布时间】:2013-10-15 19:28:13
【问题描述】:

基本上,程序应该将名称拆分为 F 和 L 名称。用户输入他们的名字,或者结合或使用空格(例如 AlexTank 或 Alex Tank)。程序应该读入每个大写字母并用空格分隔字符串。我遇到的问题是我的程序拆分了名称(识别大写字母),但从字符串的新输出中排除了大写字母。

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

int main()
{
    char name[50], first[25], last[25];
    char *pch;
    char* key = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    // ask user for name
    printf("What is your name? ");
    scanf("%s", name);

    printf("Hello \"%s\" here is your First and Last Name:\n", name);
    pch = strtok(name, key);
    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, key );
    }
    return 0;
}

【问题讨论】:

  • 您发现的问题是什么?
  • 你是正则表达式的粉丝,想不出别的了吗?

标签: c string split


【解决方案1】:

有两个问题:

  1. strtok 的第二个参数应该只是你想要的分隔符字符串,明确的。就你而言,我认为这只是一个空格 (" ")。
  2. scanf 中的 %s 在看到输入空间时停止读取。

修改程序:

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

int main()
{
    char name[50], first[25], last[25];
    char *pch;

    // ask user for name
    printf("What is your name? ");
    //scanf("%s", name);
    fgets(name, 50, stdin);

    printf("Hello \"%s\" here is your First and Last Name:\n", name);
    pch = strtok(name, " ");
    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, " ");
    }
    return 0;
}

如果您也想允许 CamelCase 名称,那么 strtok 将无法单独工作,因为它会破坏分隔符。您可以做一些简单的事情,例如预处理名称并插入空格,或编写自定义标记器。这是插入空间的想法方法。如果你只是插入空格,那么 strtok 会做你想做的事:

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

void insert_spaces(char *in, char *out)
{
    if ( !in || !out )
        return;

    while ( *in )
    {
        if (isupper(*in))
            *out++ = ' ';

        *out++ = *in++;
    }

    *out = '\0';
}

int main()
{
    char in_name[50], first[25], last[25];
    char name[100];
    char *pch;

    // ask user for name
    printf("What is your name? ");
    //scanf("%s", name);
    gets(in_name);

    printf("Hello \"%s\" here is your First and Last Name:\n", in_name);

    insert_spaces(in_name, name);

    pch = strtok(name, " ");

    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, " ");
    }
    return 0;
}

【讨论】:

  • 用户输入他们的名字,无论是组合(AlexTank)还是分开(Alex Tank),当读取大写字母时,字符串应该被拆分(插入一个空格)
  • @ArcticBlueAlex 抱歉,我没有在你的问题中理解这个意思。我更新了我的答案。
【解决方案2】:

strtok 假定您不希望返回分隔符 - 因此它将消耗它们并返回“其余部分”(即仅小写字母)。我会建议一种更简单的方法:一次回显输入字符串一个字符;如果您看到一个大写字母但不只是看到一个空格,请将其添加进去。它看起来像这样:

#include <stdio.h>

int main()
{
    char name[50];

    // ask user for name
    printf("What is your name? ");
    //scanf("%s", name);
    fgets(name, 49, stdin);

    printf("Hello. Your name is ");
    int ii = 1, foundSpace = 0;
    printf("%c", name[0]);
    while (name[ii] != '\0')
    {
        if (name[ii]==' ') foundSpace = 1;
        if (foundSpace == 0 && isupper(name[ii])) {
          printf(" %c", name[ii]);
        }
        else {
          putchar(name[ii]);
          foundSpace = 0;
        }
        ii++;
    }
    return 0;
}

看看这是否适合你!

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2015-12-09
    • 1970-01-01
    • 2022-09-28
    • 2015-01-21
    • 2012-03-18
    • 2014-08-22
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多