Fgets()不断跳过第一个字符

时间:2015-04-28 11:52:08

标签: c debugging fgets

这是在unix中模拟cat命令的更大程序的一部分。现在尝试接受输入并将其发送到stdout:

char in[1000];
int c = 0; 
while ((c = getchar()) != EOF)
 {
   fgets(in,1000,stdin);
   fputs(in, stdout);
 }

这会将输出发送到stdout,但在每种情况下都会跳过第一个字母。例如,如果我输入单词Computer

我回来了:

omputer

4 个答案:

答案 0 :(得分:8)

你的问题完全是关于进食。

0123456789

这一行,因为 C中的许多I / O操作消耗了缓冲区。这意味着,当您在getchar()之后说123456789时,请在缓冲区中留下getchar()

你想要做的是使用相同的函数来控制输入并存储它,所以摆脱while (fgets(in,1000,stdin) != NULL) { fputs(in, stdout); } 之类的东西应该可以解决问题:

var example = angular.module('starter', ['ionic', 'starter.controllers',]);

example.config(function($stateProvider, $urlRouterProvider) {
  $stateProvider
    .state('tab', {
    url: "/tab",
    abstract: true,
    templateUrl: "templates/tabs.html"
  })                                   
  .state('tab.home', {
    url: '/home',
    views: {
      'home': {
        templateUrl: 'templates/home.html'
      }
    }
  })                                  
  .state('tab.camera', {
    url: '/camera',
    views: {
      'camera': {
        templateUrl: 'templates/camera.html'
      }
    }
  })                                    
  .state('tab.category', {
    url: '/category',
    views: {
      'category': {
        templateUrl: 'templates/category.html'
      }
    }
  });
  $urlRouterProvider.otherwise('/tab/home');
});

你有它!

答案 1 :(得分:6)

ungetc函数允许将字符返回到流。它不是标准的C函数,而是在类Unix系统和Visual Studio CRT中实现的:

while ((c = getchar()) != EOF)
{
    ungetc(c, stdin);
    fgets(in, 1000, stdin);
    fputs(in, stdout);
}

但正如其他回答者所说,更清晰的方法是直接使用fgets()

while (fgets(in, sizeof(in), stdin) != NULL)

第三个选项是将第一个字符直接保存到字符串中:

while ((c = getchar()) != EOF)
{
    in[0] = c;
    fgets(in + 1, 999, stdin);
    fputs(in, stdout);
}

答案 2 :(得分:4)

它不会使用getchar()跳过您正在使用它的任何内容。

成功完成后,fgets()将返回字符串in。如果流位于文件结尾,则应设置流的文件结束指示符,fgets()将返回NULL指针。

更改此

while ((c = getchar()) != EOF)

while (fgets(in, sizeof(in), stdin) != NULL)  

答案 3 :(得分:0)

这也可以:

char in[1000];
while ((in[0] = (char)getchar()) != EOF)
 {
   fgets(in+1,999,stdin);
   fputs(in, stdout);
 }