2012-02-16 111 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

編輯:從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

從流中讀取字符和將它們存儲爲C字符串到STR直到(NUM-1)的字符已被讀出或任一換行或在達到檔案結尾,取其第一。 換行符使fgets停止讀取,但它被認爲是有效的字符,因此它被包含在複製到str的字符串中。 在讀取字符以指示C字符串結束後,空字符會自動附加到str中。

相關問題