2012-02-16 7 views
2

私は文章をトークン化してスタックに置いて、各トークンをポップバックして内容を印刷しています。最初のトークンを印刷した後に空白行が表示される以外は、すべてが正常に動作します。それは私が%sを印刷しているときにこれを行うように見えるだけですが、何か他のものを使用するとその情報はガーベッジですが、空白行は表示されません。私はすでに小さな関数を試して、fgetsがつかむ改行文字を削除するようにしました。どんな助けもありがとうございます。Cで印刷すると、この空白行が表示されるのはなぜですか?

#define BUFFER_SIZE 100 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

// self-referential structure 
struct stackNode 
{ 
    char *cData; 
    struct stackNode *pNext; 
}; 

typedef struct stackNode StackNode; 
typedef StackNode *StackNodePtr; 

// function prototypes 
void push(StackNodePtr *pTop, char *cInfo); 
char* pop(StackNodePtr *pTop); 
int isEmpty(StackNodePtr pTop); 
void printStack(StackNodePtr pCurrent); 


int main(void) 
{ 
    char sInput[BUFFER_SIZE]; 
    StackNodePtr pStack = NULL; 
    char *pToken = NULL; 
    int iIndex; 

    printf("Please enter a word to be tokenized\n"); 

    fgets(sInput, BUFFER_SIZE, stdin); 

    pToken = strtok(sInput, ", "); 

    while(pToken != NULL) 
    { 
     push(&pStack, pToken); 
     pToken = strtok(NULL, " ,"); 
    } 

    while (isEmpty(pStack) == 0) 
    { 
     printf("%s\n", pop(&pStack)); 
    } 
    return 0; 
} 

// Insert a node at the stack top 
void push(StackNodePtr *pTop, char *cInfo) 
{ 
    StackNodePtr pNew; 

    pNew = malloc(sizeof(StackNode)); 

    if (pNew != NULL) 
    { 
     pNew->cData = cInfo; 
     pNew->pNext = *pTop; // insert at top of stack 
     *pTop = pNew; 
    } 
    else 
    { 
     printf("%d not inserted. No memory available.\n", cInfo); 
    } 
} 

// Remove a node from the stack top 
char* pop(StackNodePtr *pTop) 
{ 
    StackNodePtr pTemp; 
    char *cPopValue; 

    pTemp = *pTop; // attach a pointer to element to be removed 
    cPopValue = (*pTop)->cData; 
    *pTop = (*pTop)->pNext; // remove at top of stack 
    free(pTemp); // release this memory and set it free! 

    return cPopValue; 
} 

int isEmpty(StackNodePtr pTop) 
{ 
    return pTop == NULL; 
} 

答えて

2

fgetsを使用すると、最後にの'\n'を含む行が表示されます。文字列をトークン化すると、最後のトークンには'\n'が入ります。このトークンを印刷すると、'\n'も印刷されます。手で取り除くか、scanfを使用してください。

EDIT:man fgetsから:あなたは、文字列の入力が終了したときに

Reading stops after an EOF or a newline. 
If a newline is read, it is stored into the buffer. 
0

私はコードを実行しようとしましたが、それは入力を送信するためにEnterキーを押したときの改行文字を表示しています。

あなたのコードがスタックからそれらをポップしているので、最後のトークンにあった改行文字がそこに残っています。そのため、最初のトークンの後に常に改行が入ります。

0

改行文字がfgets機能から来ています。参照hereを参照してください。

は、ストリームから文字を読み込み、(NUM-1)までのSTRにC文字列としてそれらを格納した文字読まれているか、改行またはファイルの終わりのいずれかに到達した、どちらかまず来る。 改行文字はfgetsの読み込みを停止しますが、有効な文字と見なされるため、strにコピーされた文字列に含まれます。 C文字列の終わりを知らせるために文字が読み込まれた後、自動的にNULL文字がstrに追加されます。