// 回傳 substr 在 str 中首次出現的索引(0-based),找不到回傳 -1 int findstr(const char *str, const char *substr);
int findstr(const char *str, const char *substr) {
if (str == NULL || substr == NULL) return -1;
size_t str_len = strlen(str);
size_t sub_len = strlen(substr);
if (sub_len > str_len) return -1;
if (sub_len == 0) return 0; // 空字串視為在開頭找到
// 動態配置暫存緩衝區(+1 留給結束符)
char *tmp = (char*)malloc(sub_len + 1);
if (!tmp) return -1; // 配置失敗
for (size_t i = 0; i <= str_len - sub_len; ++i) {
// 複製長度為 sub_len 的子串
strncpy(tmp, str + i, sub_len);
tmp[sub_len] = '\0'; // 確保結尾
if (strcmp(tmp, substr) == 0) {
free(tmp);
return (int)i;
}
}
free(tmp);
return -1;
}
\0,以便 strcmp 比較。也可用 memcmp 避免複製:if (memcmp(str + i, substr, sub_len) == 0) return i;malloc/free 成對出現,所有返回路徑釋放資源。int main() {
printf("%d\n", findstr("hello world", "world")); // 6
printf("%d\n", findstr("abcde", "f")); // -1
printf("%d\n", findstr("aaaaa", "aa")); // 0
printf("%d\n", findstr("", "a")); // -1
printf("%d\n", findstr("abc", "")); // 0
return 0;
}
malloc:若子串長度固定或較小,改用堆疊陣列 char tmp[256]。memcmp:避免 strncpy+strcmp 雙重掃描。next 陣列,避免回溯主串指標。此實作適合教學、小規模文字處理;生產環境高效能需求請採用標準庫 strstr 或成熟演算法庫。