2017-05-31 56 views
-2

平等,我覺得有點失落,因爲我們開始學習指針我還挺着跟着,我知道它在C.C字符串遞歸函數來找出從中間

非常重要的課題呢!

所以我就使一個遞歸函數,這將得到2個指針:

1)指針索引[0]。

2)指向字符串中間的2個字符。

現在..我要檢查從0到中間的第一部分是否相等,從中間到結束。像..... ADAMADAM。

在我轉移字符串之前,我將整個低位字母改爲大寫以避免區分大小寫......所以我得到了類似這樣的東西..但它拒絕工作。

也採用恆被禁止......

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define TRUE 1 
#define FALSE 0 
#define SS 81 
int CheckString(char *,int *); 

int main() { 
    char str[SS]; 
    int length,len,strcheck; 
    printf("Please enter a string:\n"); 
    fgets(str,SS,stdin); 

    len=(strlen(str) - 1); 
    if((len>0)&&(str[len]=='\n')) // replacing '\n' key to '\0' 
     str[len]='\0'; 

    length=len/2; 
    strcheck=CheckString(str,&length); 
    if (strcheck==FALSE) 
     printf("FALSE.\n"); 
    else 
     printf("TRUE.\n"); 
    return 0; 
} 

// function 
int CheckString(char *str, int *i) { 
if (*str != '\0') 
    if (*str == str[*i]) 
     return CheckString(str+1,i++); 
    else 
     return FALSE; 
    return TRUE; 
} 

所以我想我有一些問題與指針

+2

爲什麼你把它標記爲'C++'? – PaulMcKenzie

+1

爲什麼你將'int'指針傳遞給'CheckString()'?而'我++'可能不是你想要的。 –

+0

嗨大衛,ty迴應...多數民衆贊成在我被問... 2指針。 – Alex

回答

1

看來你指的是以下

#include <stdio.h> 
#include <string.h> 

int CheckString(const char *s, size_t *i) 
{ 
    return s[*i] == '\0' || *s == s[*i] && CheckString(s + 1, i); 
} 

int main(void) 
{ 
    char *s = "ADAMADAM"; 
    size_t i = strlen(s)/2; 

    int result = CheckString(s, &i); 
    printf("%s\n", result ? "true" : "false"); 

    return 0; 
} 

程序輸出

true 

注:也許你應該計算第二個參數的值通過以下方式

size_t i = (strlen(s) + 1)/2; 

想一想。

+0

但是使用常量字符也是禁止的,我應該提及它:/ – Alex

+1

@AlexBoyev如果刪除限定符,它將是一個錯誤的函數聲明。也就是說,這種情況下的函數可能不適用於常量字符串。但是,如果需要,您可以刪除限定符。 –

0

CheckString()中的循環中的外部條件應該檢查​​*(str + *i) != '\0',或等效地檢查str[*i] != '\0'。此外,您不需要增加*i,當然也不需要增加i,因爲這是一個指針。值*i是在字符串的兩半中檢查的字符之間的距離。

修改的功能可能看起來像:

int CheckString(char *str, int *i) { 
    if (str[*i] != '\0') { 
     if (*str == str[*i]) { 
      return CheckString(str+1,i); 
     } else { 
      return FALSE; 
     } 
    } 
    return TRUE; 
} 
+0

它完美的作品,沒有測試極限點......但你能解釋一下,'我'如何保持不變而不提升? – Alex

+0

'* i'所保存的值就是從字符串的前面到中間的距離。所以,當你給'str'加1時,'str + * i'指向中間後面的下一個字符,依此類推。 –

+0

@ Alex--請注意,由於您計算字符串中間的方式,「ADAMADAM」和「MADAMADAM」都返回TRUE。 –

0

問題規範說(或多或少):我有

做一個遞歸函數,將獲得2個指針:

  1. 指針1指向索引[0]。
  2. 指針2指向字符串的中間部分。

我必須檢查從0到中間的第一部分是否等於從中間到第二部分的第二部分,如:ADAMADAM

作爲遞歸的運動,這是好的;作爲實現功能的一種方式,遞歸是過度的(迭代很好)。

關於函數接口存在混淆(模棱兩可) - 問題的措辭似乎暗示了兩個值char *,但代碼使用指向一個整數的指針作爲第二個參數。這是奇特的。整數值可能有意義,但指向整數的指針不會。

我們需要仔細定義條件。以給出的示例字符串(char str1[] = "ADAMADAM";),這兩個指針可能爲char *p1 = &str1[0]; char *p2 = &str1[0] + strlen(str1)/2;--意指p1指向第一個Ap2到第三個A。考慮一個替代字符串:char str2[] = "MADAMADAM";;等效公式將使p1指向第一個Mp2指向第二個M

p1假設和p2在鎖步遞增,則:

  • 字符串是如果不同,在任何點*p2等於'\0'*p1 != *p2之前。
  • 如果*p2等於'\0',則字符串是相同的。
  • 按照定義,p1p2指向相同的數組,因此指針差異是合法的。
  • 此外,p1必須小於p2纔有用; p1等於p2意味着字符串是平凡的。
  • 有一個強烈的觀點認爲,「字符串中間」標準意味着要麼是p2[p2 - p1] == '\0'要麼是p2[p2 - p1 + 1] == '\0'(分別針對偶數和奇數字符串長度)。也就是說,兩個指針之間的距離表示字符串的結尾必須位於哪裏。這意味着使用p1 = &str[0]p2 = &str[2](在任何一個示例字符串上)都應該失敗,因爲字符串的末尾不在正確的位置。如果字符串爲"AMAMAMAM",則使用&str[0]&str[2]應該失敗,因爲字符串的末尾不在正確的位置;同上&str[0]和​​。
  • 但是,這個「強有力的論據」也是一個設計決定。簡單地要求從p2到EOS(字符串結尾)的子字符串與來自p1的字符串的長度相同是可行的。在那種情況下,在"AMAMAMAM"上使用&str[0]&str[2]或​​(或確實與正常&str[4])可以正常工作。

使用這些觀察中的一些導致此代碼。如果您確實不遵守const的指示,只需將const限定符刪除。該代碼將工作相同。

#include <assert.h> 
#include <stdbool.h> 
#include <stdio.h> 
#include <string.h> 

static bool identical_halfstrings(const char *p1, const char *p2) 
{ 
    assert(p1 <= p2); 
    assert(strlen(p1) >= strlen(p2) + (p2 - p1)); 

    if (*p2 == '\0') 
     return true; 
    if (*p1 != *p2) 
     return false; 
    return identical_halfstrings(p1+1, p2+1); 
} 

int main(void) 
{ 
    const char *strings[] = 
    { 
     "ADAMADAM", 
     "MADAMADAM", 
     "nonsense", 
    }; 
    enum { NUM_STRINGS = sizeof(strings)/sizeof(strings[0]) }; 

    for (int i = 0; i < NUM_STRINGS; i++) 
    { 
     const char *p1 = strings[i]; 
     const char *p2 = strings[i] + strlen(strings[i])/2; 
     printf("[%s] ([%s]) = %s\n", p1, p2, 
       identical_halfstrings(p1, p2) ? "TRUE" : "FALSE"); 
    } 
    return 0; 
} 

第二斷言確保p1p2都指向相同的字符串 - 不存在之間的位置處通過p1p2指出一個空字節。

測試用例輸出:

[ADAMADAM] ([ADAM]) = TRUE 
[MADAMADAM] ([MADAM]) = TRUE 
[nonsense] ([ense]) = FALSE 

爲了記錄,相同功能的迭代版本是:

static bool identical_halfstrings(const char *p1, const char *p2) 
{ 
    assert(p1 <= p2); 
    assert(strlen(p1) >= strlen(p2) + (p2 - p1)); 

    while (*p2 != '\0') 
    { 
     if (*p1++ != *p2++) 
      return false; 
    } 
    return true; 
} 

它產生用於採樣數據相同的輸出。