【问题标题】:Get initial postion of word in a text获取文本中单词的初始位置
【发布时间】:2015-01-27 23:23:13
【问题描述】:

我需要获取单词在文本中的位置,但我无法将带有 char *text 的指针转换为 char text[] 来比较每个字符。

我正在尝试查找与特定单词匹配的文本中第一个子字符串的位置。

#include <stdio.h>
#include <string.h>
int searchWord(char *word, char *text);

int main (int argc, char *argv[])
{
    int i,searchString;
    if (!(argc>2)) {
        printf("Need 2 args");
        return 0;
    }
    printf("aaa %d\n" ,searchWord(argv[1],argv[2]));

    return 0;
}

int searchWord(char *word, char *text) // I need use that function to search.
{
    printf("\n\n%s\n\n",&word[0]);
    return 0;
}

【问题讨论】:

  • 编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g)。以\n 结束每个printf 格式字符串或调用fflush。使用调试器gdb

标签: c


【解决方案1】:

假设text是由空格分隔的单词组成,可以考虑对text进行token化,然后遍历token,看是否匹配word。尝试使用 strtok(),网上有很多关于如何使用该函数的文档。

我在这里找到了有关如何使用 strtok 的相关问题:how to use strtok

你可以试试这样找位置:

int search(char * word, char * text, unsigned int length) {
    char * token = strtok(text, " ");
    int position = 0;

    while (token != NULL) {
        // if word matches the token, we found our word
        if (! strncmp(word, token, length)) {
            return position;
        } else {
            position += (strlen(token) + 1);
            // get the next token from the text
            token = strtok(NULL, " ");
        }
    }
    // didn't find it
    return -1;
}

【讨论】:

  • 我可以使用 strtok 进行标记,但我如何获得单词的位置?
  • 您需要跟踪您在文本字符串中的位置,我已经进行了编辑以显示您可以这样做的方式。
【解决方案2】:

char* 和 char[] 的转换不是问题,而是 char* 转换为 int 的问题,因为 argv[] 是一个字符数组的数组。

试试这个——它使用指针算法并且可能工作:

int SearchWord( char *word, char *text, unsigned int length ) {
  unsigned int i = 0, d = 0, x = 0;
  x = strlen( text );
  // Keep looping til we reach less than total length
  for (; i <= ( x - length ); i++) {
    if (strncmp( text, word, length ) == 0) {
      d = i;
      break;
    }
    else {
      // Moving 1 character position
      text++;
    }
  }
  // Check if no match was found
  if (i == (x - length) {
    return -1;
  }
  for (i = 0; i <= d; i++) {
    // Revert the text
    text--;
  }
  return d;
}

【讨论】:

  • @BrunoNovais - 我更新了我的帖子;您可以将 strlen( word ) 作为长度参数传递。
  • strcmpn -> strncmp ?在 c 中?
  • 哎呀,是的,这就是我的意思
  • 我现在无法检查该解决方案。程序收到信号 SIGSEGV,分段错误。 __strncmp_ssse3 () at ../sysdeps/x86_64/multiarch/../strcmp.S:209 209 ../sysdeps/x86_64/multiarch/../strcmp.S: [关于在葡萄牙语中找不到文件的消息]
  • 我的例子的哪一行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多