2012-02-02 43 views
1

我創建了一個程序,它接受一個輸入的字符串並向後輸出字符串。我創建了一個函數來計算字符串中的字符數。有了這些信息,我創建了另一個函數,將原始數組的第一個字符放在新數組的末尾。因此,當函數中的循環結束時,新數組包含原始數組的字母但向後。然而,我遇到了一些困難。我仍然對字符數組保持警惕,我不確定是否正確使用它們。有人可以幫我嗎?迴文項目

#include <stdio.h> 

#define MAXLINE 1000 

char backward(char str[], int count) 
int count(char str[]) 

int main() { 
    char orig[MAXLINE]; 
    int c; 

    scanf("%s", orig); 
    c = count(orig); 
    printf("%s", backward(orig, c)); 

    return 0; 
} 

char backward(char str[], int count) { 
    char back[MAXLINE]; 
    int i; 

    for(i = 0; i <= count; ++i) { 
     back[count] = str[i]; 
     --count; 

    return back; 
} 

int count(char str[]) { 
    int i; 

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

    return i; 
} 

編輯:輸入:讓我們說「小貨車」。預期產出將是「navinim」。目前還沒有實際產出。我得到這個錯誤:

palindrome.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’ 
+0

能否請您給這個程序的輸入,預期的輸出和實際輸出? – 2012-02-02 02:23:20

+1

通過引用「&」來傳遞參數,並確保返回數組不僅僅是一個字符。先嚐試編譯。 – L7ColWinters 2012-02-02 02:26:39

+2

在「落後」和「count」聲明後缺少分號(';')。 – 2012-02-02 02:28:58

回答

2

您的代碼可能不會編譯,因爲你在backward()錯過了右大括號。

char backward(char str[], int count) { 
    char back[MAXLINE]; 
    int i; 

    for(i = 0; i <= count; ++i) { 
     back[count] = str[i]; 
     --count; 
    /** You should add a } character here! **/ 

    return back; 
} 

主要編輯1:

我試圖編譯代碼,並有大量的事情不妥。這裏是工作代碼:

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

#define MAXLINE 1000 

char * backward(char * str); 

int main() { 
    char orig[MAXLINE]; 
    int c; 

    scanf("%s", orig); 
    printf("%s\n", backward(orig)); 

    return 0; 
} 

char * backward(char * str) { 
    int count = strlen(str); 
    char * back = malloc(MAXLINE); 
    int i; 
    for(i = 0; i < count; i++) 
    { 
    back[count-i-1] = str[i]; 
    } 
    back[count] = 0; // Add the null termination character. 
    return back; 
} 

當我運行這段代碼,然後輸入「ABCDE」時,輸出「EDCBA」。如果您對此有何具體問題,請告訴我。我擺脫了你count()功能,因爲它是strlen()重複,我搬到調用strlen()backward()內部,使界面到功能backward()簡單。

讓你的代碼失敗的另一件事是你在for循環中遞減count,這會導致你的for循環比你想要的更早終止。

+0

@ L7ColWinters,爲什麼是-1?我現在才意識到這個答案是不完整的,但至少它指出了OP有問題的原因之一。 – 2012-02-02 02:30:08

+0

@ l7Col:我不同意 - 當錯誤是編譯錯誤時,指出答案中的缺陷是非常有意義的。 – sarnold 2012-02-02 02:33:24

1

此行有一個錯誤的關閉:

back[count] = str[i]; 

count不是字符串的最後一個字符,它的'\0'字符。

此外,你正在返回一個堆棧變量 - 這是行不通的。

你應該扭轉串到位:

for(i = 0; i <= count; ++i) { 
    --count; 
    char tmp = str[i]; 
    str[i] = str[count]; 
    str[count] = tmp; 
} 

然後,您可以返回str

+0

返回[count - 1]? – user1064913 2012-02-02 02:26:29

+0

@ user1064913'back [ - count] = str [i];'會更好,但沒關係:你的代碼不會工作,因爲back被分配在堆棧上。你應該扭轉字符串到位。 – dasblinkenlight 2012-02-02 02:28:14

+0

什麼是解決方案? – user1064913 2012-02-02 02:36:57

5

你得到的錯誤是因爲你的原型是錯誤的:

#include <stdio.h> 

#define MAXLINE 1000 

char backward(char str[], int count) /* missing ; */ 
int count(char str[])     /* missing ; */ 

int main() { 

你也應該考慮從<string.h>頭文件與strlen(3)更換count()。標準庫中充滿了已經調試過的實用程序,並且已知它們運行良好 - 值得使用它們。 (是的,有在重新實現他們的教育意義。但在這種情況下,準備了各種邊界情況進行測試。)

0

你的程序有很多的誤區。首先,你已經遺漏了分號(;),同時聲明瞭向後和計數的原型。然後,您還沒有使用結束括號(})關閉後向函數中的for循環。 但是最大的三個問題是 1.您已經將後向函數定義爲char數據類型,但您要返回指向char數據類型數組的指針 2.您正在訪問[count]而不是back [count-1 ]。假設字符串是小型貨車。計數將保持7.最後一個字符在第6個位置不是第7個,因爲在數組下標中以0開始而不是1並且返回[count]將指向空字符,即'\ 0' 3.您正在增加i並遞減計數並檢查我< =計數。這將只處理你的字符串,直到它中間。

雖然說得方案已發佈的戴維·格雷森,但既然他已經刪除了計數功能,並介紹了strlen的和malloc函數,我對剛剛修正你的算法

#include <stdio.h> 

#define MAXLINE 1000 

char *backward(char str[], int count); 
int count(char str[]); 

int main() { 
    char orig[MAXLINE]; 
    int c; 

    scanf("%s", orig); 
    c = count(orig); 
    printf("%s", backward(orig, c)); 

    return 0; 
} 

char *backward(char str[], int count) { 
    char back[MAXLINE]; 
    int i; 

    for(i = 0; i < count; ++i) { 
     back[count-i-1] = str[i]; 
    } 
    back[i] = '\0'; 
    return back; 
} 

int count(char str[]) { 
    int i; 

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

    return i; 
} 
0

您再次發佈程序可以創建一個字符指針,然後將字符串的長度添加到這個指針,它應該可能是char *reverse = (char *)name,然後添加reverse = reverse + strlen(name) -1

然後你可以使用while循環通過字符串的開始。整個代碼看起來,

void main(void) 
{ 
    char *name = "Kernel"; 
    char *reverse = (char *)name; 
    reverse = reverse + strlen(name) - 1; 
    while(*reverse) 
     printf("%c", *reverse); 
} 
0
#include<Stdio.h> 
#include<string.h> 
int main() 
{ 
size_t i,j; 
char arr[10]={'\0'};//orignal array 
char arr2[10]={'\0'};//it's reverse to be 
gets(arr);//prompt 
strncpy(arr2,arr,10);//copy 
strrev(arr2); 
if(strncmp(arr,arr2)==0) 
    printf("plaindrom"); 
return 0; 
}