【问题标题】:How to allow spaces in string when searching for position of substring in C?在C中搜索子字符串的位置时如何在字符串中允许空格?
【发布时间】:2009-10-25 22:19:48
【问题描述】:

我的部分作业卡住了,我必须在字符串中找到最右边的子字符串。我已经完成了第一部分(可以在单个单词字符串中找到子字符串),但是现在我遇到了第二部分的问题。我必须使用 getline 的修改版本才能允许多字字符串(也就是带空格)。这是未修改的 getline() 代码和修改后的 strindex() 代码(分别)。我也很想解释一下,有时我很难理解书面代码。

编辑:所以我更新了我的代码,这里是:)

/* string index */

int strindex(char str[], char substr[]){

    int str_idx, sub_idx, k, c = -1;

    for (str_idx = 0; str[str_idx] != '\0'; str_idx++) {

        for (sub_idx = str_idx, k = 0; substr[k] != '\0' && str[sub_idx] == substr[k]; sub_idx++, k++)
            ;

        if (k > 0 && substr[k] == '\0')
            c = str_idx;

    }
    return c;
    return -1; //never reached?
}

/* getline 
*
* Variable Dictionary
* ctchars - character counter, increments once each time getchar() is called
* str_idx - current index of the string, starts at 0, increments with loop
* 
*/


getline(char str[], int lim){

    int ctchars, str_idx = 0;

    ctchars=getchar();

    for (str_idx; str_idx<lim-1 && ctchars !=EOF && ctchars!='\n'; ++str_idx)
        str[str_idx] = ctchars;

    if  (ctchars == '\n') {
        str[str_idx] = ctchars;
        ++str_idx;
    }


    str[str_idx] = '\0';
    return str_idx;

}

【问题讨论】:

  • 我的代码也有问题 :( 格式化它以便它可读。
  • 你真的需要注意正确缩进你的代码。一个有经验的程序员将仅仅通过查看它就能够阅读该代码,并且它不会通过现实世界中的任何代码审查。缩进是正确编写代码的重要组成部分(即使编译器不需要它)。
  • 如果您将变量重命名为有意义的名称,您应该更容易理解遇到的问题。例如,将 getline() 的 s 重命名为“str”,将 strindex() 的 s 重命名为“str”,将 t 重命名为“substr”(假设它是要搜索的子字符串),并将 i、j 和 k 重命名为 str_idx,和 substr_idx,以及第三个 var 应该是什么(我没有深入阅读代码;只是建议简化)。然后从 strindex 中删除 'c' 并使用 i (因为您实际上从未使用过 'c')。最后你的两个返回:'return -1' 永远不会执行 - 你已经返回了 c。
  • 你们有什么关于代码缩进帮助的资源推荐吗?我的教授们从来没有讨论过正确的代码应该是什么样子,我也让其他人告诉过我,但我不知道如何解决它。
  • 当我之前给你一个完美的“在字符串中找到一个最右边的子字符串”解决方案时,我不会回答这个问题,而你从来没有支持我的解决方案(我认为唯一正确的解决方案)或接受任何解决方案作为答案

标签: c string substring


【解决方案1】:

我有几个建议给你:

for (j=i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++);

打破这个;不要把所有东西都塞进 for 控制结构中。

j = i;
k = 0;
for (;;) {
    if (t[k] == '\0') break;
    if (s[j] != t[k]) break;
    j++;
    k++;
}

为变量取更好的名称。

haystack_inner_index = i; /* get a better name for `i` too */
needle_index = 0;
for (;;) {
    if (needle[needle_index] == '\0') break;
    if (haystack[haystack_inner_index] != needle[needle_index]) break;
    haystack_inner_index++;
    needle_index++;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2017-12-16
    • 2011-01-26
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多