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

时间:2015-04-05 16:32:14

标签: c arrays types translate

所以我可能会以错误的方式攻击这个;我正在学习一些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);
}

3 个答案:

答案 0 :(得分:1)

你打算用这一行打破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]);

只需将其删除,然后从ind打印store[]个字符。

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

你犯了以下错误。

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”值,因此text [i]始终返回“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”,存储);

这应该是这样的

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] = '\0';
    printf("%s\n", store);
    return 0;
}