我正在尝试创建一个类似于记事本的简单程序来输入命令提示符。但是使用scanf()函数按“Enter”键无法准确到达下一行。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim pf As PivotField
Dim pf_Slave As PivotField
Set pf = ActiveSheet.PivotTables("PivotTable1").PivotFields("VRTY")
Set pf_Slave = ActiveSheet.PivotTables("PivotTable2").PivotFields("number")
If Not Intersect(Target, pf.DataRange) Is Nothing Then
On Error Resume Next
pf_Slave.CurrentPage = CStr(Target)
On Error GoTo 0
End If
End Sub
(我知道scanf()在缓冲区中留下新的char。我已经尽力摆脱这个问题。使用getch()函数比scanf()之后但是我无法使它工作。我必须使用scanf()函数理解这个问题所以我想避免使用字符串或其他东西等替代方法
答案 0 :(得分:4)
嗯,你有点不幸。这是C编程开始时的一个流行问题。在C
中,'\n'
和"n"
之间存在巨大差异。第一个是单个字符,因此'\n'
的类型为char
。另一个是字符串,C
中的字符串是char[]
s。这意味着实际"\n" = ['\n', '\0']
字符串在'\0'
中以C
终止。
另一件事是,scanf
忽略了前导的白色标志,而新的线条则是白色标志。如果您想获得更多字符,请改用fgets
。对于单人阅读,scanf仍然可以。
在this堆栈溢出主题中广泛描述了这一点。
#include<stdio.h>
void main () {
char c;
for(;;){
scanf("%c", &c);
if(c == '\n'){
printf("\n");
} else{
printf("%c", c);
}
}
}
答案 1 :(得分:0)
我认为使用getch()
来实现您尝试实现的目标会更好。
while(1){
int i = getch();
if(i==13) printf("\n");
// [Maybe an else if ladder for different shortcuts/keys...]
else printf("%c",i);
}
我知道我迟到了,但是我希望这个答案对将来阅读它的人有所帮助。