如何使用scanf获取换行符?

时间:2016-08-12 11:20:01

标签: c scanf

我正在尝试创建一个类似于记事本的简单程序来输入命令提示符。但是使用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()函数理解这个问题所以我想避免使用字符串或其他东西等替代方法

2 个答案:

答案 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);
}

我知道我迟到了,但是我希望这个答案对将来阅读它的人有所帮助。