C程序查找字符串中的子串

C program to find substring in string

所以我可能以错误的方式攻击它;我正在学习一些 Javascript 并编写了一个程序,该程序将查找包含在另一个字符串中的字符串并将匹配项存储在数组中(抱歉,如果这没有太大意义,请参阅我的 C 程序应该有帮助)。我试图将我的程序翻译成 C,但它不起作用;我认为我的问题是数据类型:

 int main () {
    char text[58];
    strcpy(text, "I am James, James the Great, a pretty cool guy named James"); 
    char store[16];
    char name[6] = "James";
    for (int i = 0; i <= 16; i++) {
        if (text[i] == 'J') {
            for (int k = i; k < i + 6; k++) {
                store[k] = text[i];
                }
        }
    }
    int a = sizeof(store) / sizeof(store[0]);
    for (int b = 0; b < a; b++) {
        /* This should print out the values stored in the store array */
        printf("%d", store[b]);
    }
    return 0;
}

我的预期结果是这样的:

JamesJamesJames

相反,我得到:

10000747474747474-6374747474

所以我假设它完全按照我告诉它的去做,只是没有将字母作为字母存储到数组中,这有点令人困惑。有更好的方法吗?

这是我试图翻译的 javascript 代码:

var text = "I am James, James the Great, a pretty cool guy named James";

var myName = "James";
var hits =[];
for (i = 0; i < text.length; i++) {
  if (text[i] === "J") {
      for (var j = i; j < i + myName.length ; j++) {
          hits.push(text[j]);
      }
  }
}
if (hits.length === 0) {
    console.log("Your name wasn't found!");
} else{
    console.log(hits);
}
int main (void) {
    char text[] = "I am James, James the Great, a pretty cool guy named James"; 
    char name[] = "James";
    char store[16] = {0};
    int store_index = 0;
    for (int i = 0; i < strlen(text); i++) {
        if (text[i] == 'J') {
            for (int k = i; k < i + strlen(name); k++) {
                store[store_index++] = text[k];
            }
        }
    }
    if(strlen(store)==0) {
        printf("Your name wasn't found!\n");
    } else {
        printf("%s\n", store);
    }
    return 0;
}

重写版本。

int main (void) {
    char text[] = "I am James, James the Great, a pretty cool guy named James"; 
    char name[] = "James";
    char store[sizeof(text)];
    char *p = strstr(text, name);
    if(p == NULL) {
        printf("Your name wasn't found!\n");
    } else {
        int len = strlen(name);
        int index = 0;
        do {
            memcpy(store + index, name, len);
            index += len;
            p = strstr(p + len, name);
        } while(p != NULL);
        store[index] = 0;

        printf("%s\n", store);
    }
    return 0;
}

你将用这行 store[] 中断

for (int k = i; k < i + 6; k++) {

因为您写入的索引与您在 text[] 中找到的文本相同。你也循环了太多次(6)

int ind = 0;
for (int k = 0; k < 5; k++) {
    store[ind++] = text[i+k];
}

那么您的下一条语句不会告诉您有关您收集的数据的任何信息

int a = sizeof(store) / sizeof(store[0]);

只需删除它,并从 store[].

打印 ind 个字符

您犯了以下错误。

for (int i = 0; i <= 16; i++)

您按“16”进行迭代,但这不是正确的文本长度。

for (int k = i; k < i + 6; k++)

所以你迭代 "i, i+1, i+2, i+3, i+4, i+5, i+6" 这里有 7 个字符,"James" 有 6 个。

store[k] = text[i];

您没有更改 "i" 值,因此文本 [i] 始终 return 'J'。最好使用 savePoistion 变量,我在下面的代码中也是如此。

int a = sizeof(store) / sizeof(store[0]);
    for (int b = 0; b < a; b++) {
        /* This should print out the values stored in the store array */
        printf("%d", store[b]);
    }

我不知道你想在这里做什么。真没必要。

printf("%d", store[b]);

"%d" 表示您正在打印整数,所以不要对您的输出是数字感到惊讶。只是简单地 printf("%s\n", store);

这应该是这样的

int main () {
    char text[58];
    strcpy(text, "I am James, James the Great, a pretty cool guy named James");
    char store[20];
    int len = strlen(text);
    int savePosition = 0;

    int i, k;
    for (i = 0; i < len; i++) {
        if (text[i] == 'J') {
            for ( k = i; k < i + 5; k++) {
                store[savePosition] = text[k];
                ++savePosition;
                }
        }
    }
    store[savePosition] = '[=15=]';
    printf("%s\n", store);
    return 0;
}