c - 为什么用 C 语言打印时会出现这个空行?

标签 c printf strtok

我只是标记一个句子并将其放入堆栈中,然后将每个标记弹出并打印内容。一切都按其应有的方式工作,除了在打印第一个标记后我得到一个空行。它似乎只在我打印 %s 时才会执行此操作,如果我使用其他任何内容,则该信息是垃圾,但我没有得到空行。我已经尝试了一个小函数来确保去掉 fgets 抓取的换行符。如有任何帮助,我们将不胜感激。

#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;
} 

最佳答案

当您使用fgets时,您会读取最后一行包括'\n'。当您对字符串进行标记时,此 '\n' 位于最后一个标记中。当您打印此 token 时,您也会打印 '\n' 。您应该手动删除它,或使用 scanf

编辑:来自man fgets:

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

关于c - 为什么用 C 语言打印时会出现这个空行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304583/

相关文章:

c - printf %s on char *ptr 是否遵循它?

c++ - VSCode错误: "incorrect use of va_start"

c - 关于strtok()的一些设置

c - 使用缓冲区/动态内存的笔划空间

r - 根据数字有多大,将 '00' 放在整数前面?

c - ANSI C - 文本文件 : Modify Line?

c - Xcode 中的 strlen EXC_BAD_ACCESS - c

c - 找到第 10000 个素数

c - 在 C 中使用 strtok/sscanf 进行字符串操作

c - linux 中的异步 memcpy?