簡體   English   中英

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

您將用此行中斷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字符即可。

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 <= 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個字符,“詹姆斯”有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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM