这是在unix中模拟cat命令的更大程序的一部分。现在尝试接受输入并将其发送到stdout:
char in[1000];
int c = 0;
while ((c = getchar()) != EOF)
{
fgets(in,1000,stdin);
fputs(in, stdout);
}
这会将输出发送到stdout,但在每种情况下都会跳过第一个字母。例如,如果我输入单词Computer
我回来了:
omputer
答案 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);
}