私は文章をトークン化してスタックに置いて、各トークンをポップバックして内容を印刷しています。最初のトークンを印刷した後に空白行が表示される以外は、すべてが正常に動作します。それは私が%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;
}