关于getchar()一些问题
本帖最后由 a327904410 于 2021-12-10 16:09 编辑帮我看下注释的部分代码就行。我现在输出的内容有的开头没首字母。我的想法是输入两次换行符代表输入结束,求修正
输入输出都是这个:
dog ogday
cat atcay
pig igpay
#include<stdio.h>
#include<string.h>
struct Entry {
char english;
char foreign;
}entries;
int main() {
int num = 0;
char word;
while (1) {
scanf("%s%s", &entries.english, &entries.foreign);
num++;
//getchar();
//if (getchar() == '\n') {
// break;
//}
}
int i;
for (i = 0; i < num; i++) {
printf("%s %s\n", entries.english, entries.foreign);
}
return 0;
} 本帖最后由 jhq999 于 2021-12-10 07:53 编辑
用了比较笨的方法,如果遇到一个字母的单词,bug
int main() {
int num = 0;
char word,ch=0;
while (1) {
if ((ch=getchar()) == '\n') {
break;
}
else
{
entries.english=ch;
}
scanf("%s%s", entries.english+1, entries.foreign);
num++;
getchar();
}
//QuickSort(entries, 0, num - 1);
int i;
for (i = 0; i < num; i++) {
printf("%s %s\n", entries.english, entries.foreign);
}
return 0;
} 如果有原题目更好,抱歉了,我完全不明白你的问题。 #include <stdio.h>
int main(){
char c, str; // 一个字符和一个字符串
int i = 0;
while((c = getchar()) != '\n'){
str = c;
}
printf("%s", str);
return 0;
} 本帖最后由 jhq999 于 2021-12-10 11:28 编辑
想完美,没想到什么完美的办法,只有对相对底层进行操作
int main() {
int num = 0;
char word,ch=0;
//FILE* fl=(FILE*)stdin;
while (1) {
ch=getchar();
if (ch=='\n')
{
break;
}
else
{
(FILE*)stdin->_ptr--;
(FILE*)stdin->_cnt++;
}
scanf("%s%s", &entries.english, &entries.foreign);
getchar();
//fflush(stdin);
num++;
}
//QuickSort(entries, 0, num - 1);
int i;
for (i = 0; i < num; i++) {
printf("%s %s\n", entries.english, entries.foreign);
}
return 0;
}
dog ogday
cat atcay
pig igpay
dog ogday
cat atcay
pig igpay 傻眼貓咪 发表于 2021-12-10 10:01
如果有原题目更好,抱歉了,我完全不明白你的问题。
其实前面的代码应该不发出来的,有点乱。。。我主要的问题是要求输入和输出一致而已(也就是我注释那一部分修改,其他地方没问题){:10_266:} jhq999 发表于 2021-12-10 11:18
想完美,没想到什么完美的办法,只有对相对底层进行操作
这道题的C++做法是(我注释那部分改为)
cin.get();
if(cin.peek() == '\n')
break;
只不过我这个是换成C的做法 傻眼貓咪 发表于 2021-12-10 10:01
如果有原题目更好,抱歉了,我完全不明白你的问题。
比如我现在代码输入输出是这样{:10_256:}
dog ogday
cat atcay
pig igpay
dog ogday
at atcay
ig igpay jhq999 发表于 2021-12-10 11:18
想完美,没想到什么完美的办法,只有对相对底层进行操作
能看懂,但复杂了许多。大佬参考下我给你的C++做法看能不能再修改下? a327904410 发表于 2021-12-10 16:08
能看懂,但复杂了许多。大佬参考下我给你的C++做法看能不能再修改下?
太简单了吧?输入什么就输出什么?#include <stdio.h>
int main(){
char str;
for(int i = 0; i < 3; i++) fgets(str, 100, stdin);
for(int i = 0; i < 3; i++) printf("%s", str);
return 0;
} a327904410 发表于 2021-12-10 15:53
这道题的C++做法是(我注释那部分改为)
getchar();
int ch = getchar();
ungetc(ch, stdin);
if(ch == '\n') break;
人造人 发表于 2021-12-10 16:17
ungetc还有这个函数呐?{:5_104:} jhq999 发表于 2021-12-10 16:49
ungetc还有这个函数呐?
en a327904410 发表于 2021-12-10 16:08
能看懂,但复杂了许多。大佬参考下我给你的C++做法看能不能再修改下?
看11楼,没想到还有ungetc函数,{:5_104:} 傻眼貓咪 发表于 2021-12-10 16:14
太简单了吧?输入什么就输出什么?
是的,但我看C++代码这边说删除行末的换行符,所以我就联想到getchar()函数,但不会怎么运用 jhq999 发表于 2021-12-10 16:51
看11楼,没想到还有ungetc函数,
OK a327904410 发表于 2021-12-10 20:54
是的,但我看C++代码这边说删除行末的换行符,所以我就联想到getchar()函数,但不会怎么运用
都可以,单是 C 语言输入法,多到你无法想象,一般只用到 scanf()、gets()、getchar()、等等,还有很多。方法构造也很多样 人造人 发表于 2021-12-10 16:17
牛{:10_266:} 傻眼貓咪 发表于 2021-12-10 20:57
都可以,单是 C 语言输入法,多到你无法想象,一般只用到 scanf()、gets()、getchar()、等等,还有很多 ...
你代码是输入有限数据,我这个是没限制的,输入完验证是否有'\n'就退出循环。所以要用到getchar()来清除'\n'来避免换行操作导致判断错误,也就是说我要敲两下回车结束输入的意思。所以对getchar()的运用就难到我了{:10_266:}
页:
[1]