【问题标题】:Getting the length of a String Token获取字符串令牌的长度
【发布时间】:2013-08-25 11:31:06
【问题描述】:

C 编程:

我正在尝试获取字符串中每个单词的长度,但是无论我使用什么方法都会遇到大量麻烦并出现分段错误。

我最初试图只使用“strlen(pstr)”,但这导致了分段错误。

这是我的最新尝试,但仍然会导致分段错误:

void format_text(char* text)
{
    char* pstr;
    char  copied[1000];
    int   loop;
    int   strCnt = 0;
    int   temp;
    int   strSize[100];
    int   strNo[100];

    pstr = strtok(text, " ");
    while (pstr != NULL)
    {
        pstr = strtok(NULL, " ");
        strcpy(copied, pstr);
        strSize[strCnt] = strlen(copied);
        strCnt++;
    }

    printf("the number of strings is: %d\n", strCnt);
    for (loop = 0; loop < strCnt; loop++)
    {
        printf("The length of string %d is %d\n", loop + 1, strSize[loop]);
    }
}

如何获取并打印每个单词(token)的长度?

【问题讨论】:

  • 您不会碰巧在只读字符串文字上调用format_text,对吗?
  • 我不是 100% 的字符串文字,因为我只是 C 语言的初学者,但我认为不是。它只是使用 fgets 的普通字符串的用户输入。我能够打印出指针(pstr),但无法在其上使用 strlen。 strlen 应该在指针上正常工作,但在这种情况下我得到了分段错误。不知道为什么。我假设将 pstr 复制到一个字符串和 strlen 中,但我也因此得到了分段错误。
  • 例如"this is a string literal"。所以只是""之间的一些硬编码文本。

标签: c token strtok strlen


【解决方案1】:

您不需要copied 字符串来获取长度,您可以简单地使用pstr。并且,strtok() 需要放在strlen() 之后,否则会漏掉第一个单词的长度。

以下是应该起作用的:

    pstr = strtok(text, " ");
    while (pstr != NULL)
    {
        strSize[strCnt++] = strlen(pstr);

        pstr = strtok(NULL, " ");
    }

【讨论】:

    【解决方案2】:

    strtok() 函数在没有其他令牌返回时返回pstr == NULL,但是您的代码不会注意到这一点,而是立即调用strcpy(copied, pstr);,这将导致您的崩溃。在使用 pstr 之前检查 NULL 并立即终止循环。

    对于额外的学习点,请在调试器中逐步完成以准确了解所发生的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多