【问题标题】:How to get newline sign using scanf?如何使用scanf获取换行符?
【发布时间】:2016-12-19 09:28:46
【问题描述】:

我正在尝试创建一个简单的类似记事本的程序来输入命令提示符。但是使用 scanf() 函数按“Enter”不能准确到达下一行。

#include<stdio.h>
void main ()
{
char c;
for(;;){
        scanf("%c", &c);
   if(c == "\n"){
        printf("\n");
        }
   else{
        printf("%c", c);
        }
}
}

(我知道 scanf() 将新字符留在缓冲区中。我已尽力解决这个问题。在 scanf() 之后使用了 getch() 函数,但我无法使其工作。我必须了解 scanf() 函数的这个问题,所以我想避免使用字符串或其他方法等替代方法)

【问题讨论】:

  • "\n" 是一个字符串(包含一个字符),'\n' 是一个字符
  • 你的意思是说你的编译器没有警告你,或者你选择忽略它?告诉我一些事情,出现在SO中,写一个问题,发布它,等待答案,真的太有趣了吗?
  • @FarhanFuad "什么是指针" 如果这是你的问题,立即去读一本 C 书。不要试图直接写代码。
  • 另外出于性能原因,不要使用scanf 来读取字符。将c 声明为int,而只声明fgetc。记得检查 EOF 以及(将变量声明为 int 起作用)。
  • 最后,如果您只想在读取换行符后打印一个换行符,则不需要if 语句。如果c 是换行符,打印c 将打印一个换行符。

标签: c scanf


【解决方案1】:

嗯,你有点不幸。这是 C 编程开始时的一个流行问题。在C'\n'"n" 之间存在巨大差异。第一个是单字符,所以'\n'的类型是char。另一个是字符串,C中的字符串是char[]s。这意味着实际上 "\n" = ['\n', '\0'] 作为字符串在 C 中以 '\0' 终止。

另一件事是,scanf 忽略了前导的白色标志,而新行是一个白色标志。如果您想获得更多字符,请改用fgets。对于读取单个字符,scanf 仍然可以。

这在this 堆栈溢出主题中得到了广泛描述。

#include<stdio.h>
void main () {
    char c;
    for(;;){
        scanf("%c", &c);
       if(c == '\n'){
           printf("\n");
       } else{
             printf("%c", c);
       }
    }
}

【讨论】:

  • 请注意,对于"%c" 格式,scanf 不会跳过空格。
  • 嗯,它仍然无法在我的电脑上运行。你检查了吗?
  • @FarhanFuad 是的,我做到了。你是复制/粘贴还是重写?你重新编译了吗?你的 printf 和我一模一样吗?
  • 是的,我复制粘贴了。比如说,我输入了“你好”,然后当我按下回车键时,下一行会打印另一个“你好”,然后光标会到达该行
  • 所以这正是你描述的问题。
【解决方案2】:

我认为最好使用getch() 来实现您想要实现的任何目标。

while(1){
  int i = getch();
  if(i==13) printf("\n");
  // [Maybe an else if ladder for different shortcuts/keys...]
  else printf("%c",i);
}

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

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多