2013-06-23 40 views
0

在這裏,我正在檢查一個句子,檢查它是否是迴文。我是在學習堆棧的過程中這樣做的。在c中使用指針進行字符串操作

有沒有辦法我可以使用指針而不是字符數組'發送',以便在下面的代碼中輸入字符的數量不需要限制爲20? 代碼工作正常,但是應該在性能或其他方面有所改進嗎? 有什麼重要的指針,我應該記得使用堆棧,如初始化爲NULL? 感謝

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

typedef struct node 
{ 
    char data; 
    struct node *link; 
}StackNode; 

void insertData(StackNode **); 
void push(StackNode **, char); 
void checkData(StackNode **); 
bool pop(StackNode **,char *); 

char sent[20] = ""; 

void main() 
{ 
    StackNode *stackTop; 
    stackTop = NULL; 
    insertData(&stackTop); 
    checkData(&stackTop); 
    printf("\n"); 
    return; 
} 

void insertData(StackNode **stackTop) 
{ 
    char c; 
    int len; 

    printf("Enter the Sentence\n"); 
    while(((c = getchar()) != '\n')) 
    { 
     if(((c>='a' &&c<='z') || (c>='A' && c<='Z'))) 
     { 
      if((c>='A' && c<='Z')) 
      { 
       int rem; 
       rem = c-'A'; 
       c='a' + rem; 
      } 
      push(stackTop,c); 
      len = strlen(sent); 
      sent[len++]=c; 
      sent[len]='\0'; 
     } 
    } 
    printf("Letters are %s\n\n",sent); 
} 

void push(StackNode **stackTop,char c) 
{ 
    StackNode *pNew; 
    pNew = (StackNode*) malloc(sizeof(StackNode)); 
    if(!pNew) 
    { 
     printf("Error 100:Out of memory\n"); 
     exit(100); 
    } 
    pNew->data = c; 
    pNew->link = *stackTop; 
    *stackTop = pNew; 
} 

void checkData(StackNode **stackTop) 
{ 
    char c; 
    int i=0; 
    while(pop(stackTop,&c)) 
    { 
     if(c !=sent[i++]) 
     { 
      printf("Not palindrome"); 
      return; 
     } 
    } 
    printf("Palindrome"); 
} 

bool pop(StackNode **stackTop,char *c) 
{ 
    StackNode *pNew; 
    pNew = *stackTop; 
    if(pNew == NULL) 
     return false; 
    *c = pNew->data; 
    *stackTop = pNew->link; 
    printf("char poped %c\n",*c); 
    free(pNew); 
    return true; 
} 
+1

代碼中的任何地方都沒有字符數組,我也沒有看到任何20個字符的限制。這個問題似乎與代碼沒有任何關係。 – interjay

+0

你的問題似乎並不符合你的代碼,但你總是可以使用指針而不是數組。 – mah

+0

對不起,請現在檢查 – IRock

回答

0

據我所知,目前還沒有辦法有一個「無限陣列」,或者沒有限制的數組。但是,如果使用malloc,則可以生成足夠大的內存部分,以至於不必擔心這些限制。我後面在使用malloc的代碼中看到了,所以我假設你知道它是如何工作的。不過,我會用這樣的東西;

char * sent = malloc(sizeof(char) * 100); 
if(sent == NULL){ 
    printf("OUT OF MEMORY!"); 
    return 1; 
} 

其中100是您希望擁有的緩衝區大小。我使用的尺寸高達10000,並且在運行時沒有問題,所以這可能是您需要的。

0

在C中,數組實際上是靜態分配內存的指針。創建指向數組的指針或數組中的任何元素是非常簡單的。例如,假設我們有數組char sent[20].如果我們想創建一個指向與發送完全相同的內存的指針,我們可以聲明char *sentP = sent。我們現在可以用sentP代替sent的任何使用。我們甚至可以創建一個指向發送中間的指針:char *sentMidP = sent + 9。現在,sentMidP[0]相同sent[9]sentMidP[-9]相同sent[0].

然而,不同於sent,我們可以更改sentPsentMidP點(認爲sent作爲一個常量指針char * const,你不能改變)。因此,如果你有另一個陣列char sent2[100]'. You can set the value of sentP to sent2 . What's cool about this is that you can do it *at runtime*, which effectively means that you can change the size of sentP`取決於你的輸入大小。

但是,沒有必要限制自己靜態分配輸入。 C提供了malloc函數(請參見here)在運行時分配內存。因此,如果你在編譯時不知道你的句子的大小,但你會在運行時知道它(例如在一個名爲sentenceLength的變量中),你可以像下面那樣分配`sentP'。

char *sentP = malloc(sizeof(char) * (sentenceLength + 1)); // Plus one for the NUL termination byte in C strings 
if (sentP == NULL) { 
    fprintf(stderr, "No more memory :("); 
    exit(EXIT_FAILURE); 
} 

注意我們現在必須處理內存不足錯誤。一般來說,動態分配會帶來更多的開銷,因爲我們可能會耗盡內存,要求我們確保只訪問分配的內容,並且需要在完成後用free釋放內存。

當你與sentP指針完成,一定要與釋放它:

free(sentP); 

這就是它!您可以使用我們在您的代碼中創建的sentP指針,並且一切都應該很好。祝你好運!