2013-06-23 4 views
0

여기 문장이 회문인지 아닌지 확인하고 있습니다. 스택을 학습하는 과정에서이 작업을 수행하고 있습니다.문자열 조작을위한 포인터 사용하기

입력 된 문자의 수가 다음 코드에서 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을 선언 할 수 있습니다. 이제 sent의 사용을 sentP으로 바꿀 수 있습니다. 우리는 보낸 메시지의 중간에 포인터를 만들 수도 있습니다 : char *sentMidP = sent + 9. 이제 sentMidP[0]sent[9]sentMidP[-9] 같은 것은 sentPsentMidP 점 (사용자가 변경할 수없는 상수 포인터 char * constsent 생각) 여기서 sent는 달리, 우리는 변경할 수 sent[0]. 그러나

과 동일합니다. 따라서 다른 배열이 있다면 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 포인터를 사용할 수 있으며 모든 것이 잘 작동합니다. 행운을 빕니다!