首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在C中打印时会出现这个空行?

为什么在C中打印时会出现这个空行?
EN

Stack Overflow用户
提问于 2012-02-16 10:16:53
回答 2查看 1.4K关注 0票数 2

我只是对一个句子进行标记化,并将其放到堆栈中,然后弹出每个标记并打印内容。除了在打印第一个令牌后我得到一个空行之外,一切都按它应该的方式工作。它似乎只有在我打印%s时才这样做,如果我使用其他任何东西,信息是垃圾,但我不会得到一个空行。我已经尝试了一个小函数,以确保去掉fget抓取的换行符。任何帮助都是非常感谢的。

代码语言:javascript
复制
#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;
} 
EN

回答 2

Stack Overflow用户

发布于 2012-02-16 10:27:42

我试过运行您的代码,从外观上看,它打印了在您按enter键提交输入时出现的换行符。

因为您的代码将它们从堆栈中弹出,并以相反的顺序打印这些标记,所以最后一个标记上的换行符仍然存在,这就是为什么它总是在第一个标记之后的换行符。

票数 0
EN

Stack Overflow用户

发布于 2012-02-16 10:31:03

当您输入完字符串时,换行符来自fgets函数。请参阅参考here

从流中读取字符,并将它们作为C字符串存储到字符串中,直到读取了(num-1)个字符,或者到达换行符或文件结尾,以先到者为准。换行符使fgets停止读取,但它被视为有效字符,因此它包含在复制到str的字符串中。在读取的字符之后,str中会自动追加一个空字符,以表示C字符串的结束。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9304583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档