大佬们好!我想问下while(条件) 条件里用scanf的问题

P1320 压缩技术(续集版)

我是大帅比ZED @ 2022-10-16 23:01:18

疑惑:

1.while (条件)

  此处条件为何不能 用scanf("%c", &right);来实现
  而是取用cin?
  1.1 如果我想用scanf 又该如何处理呢?

2.cout << sqrt(n);

  为何我直接用printf("%d", sqrt(n));系统却会报错?然后输出不了
  2.1 解决方法难道只有 用cout 或者 定义一个新的变量来解决吗?

报错原因

[警告] format '%d' expects argument of type 'int', but argument 2 has type 'gnu_cxx::__enable_if<true, double>::type' {aka 'double'} [-Wformat=]

#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;

int main (void)
{
    int n = 0;//读入n个数 最后输出 n^0.5

    int point = 1, count[200*200+1] = {0};//point 代表指向count数组 用来计数0或1 单次累计
    char left = '0', right;//题目先从0开始读入 所以先给left附上0
    while (cin >> right)
    {//疑惑1
        n++;//有多少个数字 就加多少个
        if (right != left)//如一直读入都是0 突然出现1了 那么point 该下一位了
        {
            point ++;
            count[point]++;
        }
        else
        {//否则继续累加
            count[point]++;
        }
        left = right;//向右滚动
    }

    //以下是疑惑2
    //int n2 = sqrt(n);printf("%d", n2);
    //printf("%d", sqrt(n));
    cout << sqrt(n);
    for (int i=1; i<=point; i++)
        printf(" %d", count[i]);

    return 0;
}

by Terminator_SHH @ 2022-10-16 23:03:31

@我是大帅比ZED sqrt 返回值是 double ,改成 %lf 就行了


by Hisaishi_Kanade @ 2022-10-16 23:05:00

  1. scanf("%c") 不过滤空白字符,会读入换行等,导致结果错误。解决办法一般有读入字符串 scanf("%s",str); 再取 str[0] 或者使用 scanf(" %c")。这个空格相当于命令他过滤掉当前空白字符。
  2. sqrt() 返回值是 double 类型。你的占位符却是 %d -> int,编译器自然会报错。你可以 printf("%f"/"%lf") 或者强制类型转换。

by hmya @ 2022-10-16 23:43:17

@我是大帅比ZED scanf("类型",x)!=EOF是可以的


by 我是大帅比ZED @ 2022-10-17 08:22:02

@shh123456 感谢orz!


by 我是大帅比ZED @ 2022-10-17 08:22:22

@bye_wjx 感谢orz!


by 我是大帅比ZED @ 2022-10-17 08:22:35

@H2OCaO 感谢orz!


by 我是大帅比ZED @ 2022-10-17 10:18:05

@bye_wjx 大佬那个str[0]是啥意思呀


|