【问题标题】:C program to find substring in stringC程序在字符串中查找子字符串
【发布时间】:2015-06-10 03:46:15
【问题描述】:

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

【问题讨论】:

  • 0) "%d" --> "%c"
  • 单纯使用系统函数strstr()会不会有问题?

标签: c arrays types translate


【解决方案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]);

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

【讨论】:

    【解决方案2】:

    你犯了以下错误。

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

    【讨论】:

    • 是的,我想我之前是 %s 的,但它不小心变成了 %d。非常感谢你,很好的答案,真的很容易理解!
    【解决方案3】:
    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;
    }
    

    【讨论】:

    • 用更好的答案击败我,但我建议for (int i = 0; i &lt;= strlen(text)-strlen(name); i++)
    • @WeatherVane 是的,这段代码有问题。但我正在尝试翻译 javascript 版本。
    • 很棒的代码,但有点难以与 javascript 关联起来,哈哈。但这肯定会帮助我更好地感受 C 语言,谢谢!
    • @steelcowboy dagi12 的代码与他的评论指出的 Weather Vane 有同样的问题。
    猜你喜欢
    • 2014-08-12
    • 2013-06-01
    • 1970-01-01
    • 2015-01-28
    • 2012-11-10
    • 2011-07-13
    • 2011-04-10
    相关资源
    最近更新 更多