n个数的和

时间:2015-09-04 10:20:37

标签: c

System.out.println(removeAdjacentDuplicates(
     Arrays.asList(1, 10, 10, 23, 31, 50, 50, 50, 65, 71, 89, 100)));
// [1, 10, 23, 31, 50, 65, 71, 89, 100]

在上面的代码中,它应该显示n个数字的总和。但是在我的代码中,它需要一个额外的m值(m是计算总和所需的值的数量)。

例如,如果我将m取为3则需要4个输入并显示3的总和。

4 个答案:

答案 0 :(得分:2)

正如其他人(@ BLUEPIXY和@BillDoomProg)已在评论中指出的那样,您的问题是scanf格式字符串中的空格。另请查看this answer

更改scanf格式字符串:

scanf("%d ",&m);
...
scanf("%d ",&num);

要:

scanf("%d", &m);
...
scanf("%d", &num);

只需删除空格即可。

scanf()的

来自手册

  

格式字符串由一系列指令(...)

组成      

指令是以下之一:

     

一系列空格字符(空格,制表符,换行符等;请参阅   isspace为(3))。该指令匹配任意数量的空白区域,包括   没有,在输入中。

另请注意,stdin已缓冲,因此结果与您的预期略有不同:

man stdin
  

备注

     

stderr 是无缓冲的。流 stdout 时是行缓冲的   它指向一个终端。在fflush(3)或之前,部分行不会出现   调用exit(3),或打印换行符。这可能会产生意外   结果,尤其是调试输出。缓冲模式   可以使用setbuf(3)更改标准流(或任何其他流)   或者setvbuf(3)调用。请注意,如果 stdin与终端关联,   完全也可以在终端驱动程序中进行输入缓冲   与stdio缓冲无关。 (实际上,通常终端输入是线路   在内核中缓冲。)可以使用修改此内核输入处理   像tcsetattr(3)这样的调用;另见stty(1)和termios(3)。

因此,让我们一步一步检查你的程序。

您的程序开始运行并输入数字2.这就是输入缓冲区的样子:

2\n

scanf("%d ", &m)m变量分配2并开始尝试匹配空格。得到NLEOL。控件仍然使用此scanf,因为它只是匹配换行符(被认为是空格)并且正在等待更多匹配,但是它得到了End-Of-Line,因此当您键入时它仍在等待:

1\n

然后再次读取 stdin 并意识到输入流中的下一个字符不是空格并返回(它完成了格式字符串条件)。此时,您进入循环,并且您的下一个scanf("%d ",&num)被调用,并且它想要读取一个整数它所做的:它读取1并存储在num变量中。然后它再次开始匹配空格并获得新线并重复上述模式。然后当你输入:

2\n

第二个scanf获得的字符与白色空格不同 并返回,因此您的循环范围继续执行打印当前sum。 不满足循环中断条件,因此它再次启动。它叫做 scanf它有效地将一个整数读入变量,然后是 模式重演......

3\n

它正在等待一个白色空间,但却有一个角色。所以你的 scanf返回,现在符合循环中断条件。这是你退出循环的地方,打印整个sum并让那个 weired砍掉它 "添加" 3个数字,但总和只添加前2个(如您所愿 首先)。

您可以通过添加代码来检查 stdin 中的3个:

#include <stdio.h> 

int main()
{

    int m, i, sum, num;
    char c;

    i = 0;
    sum = 0;
    scanf("%d ", &m);

    while (i < m) {
        scanf("%d ", &num);

        sum = sum + num;

        i = i + 1;
        printf("Value of sum= %d\n", sum);
    }

    while((c = getchar()) != '\n') 
        printf("Still in buffer: %c", c);

    return 0;
}

这将输出(使用上面的输入,couse):

$ ./sum1
2
1
2
Value of sum= 1
3
Value of sum= 3
Still in buffer: 3

答案 1 :(得分:1)

这是因为%dscanf之后有空格。

更改

scanf("%d ",&num);

scanf("%d",&num);   

Scanf通常会忽略空格,因此您不希望格式字符串中包含空格。

答案 2 :(得分:0)

这是extra space in scanf()的原因。更改scanf("%d ",&num) to scanf("%d",&num)

Scanf(), fscanf()开始,您可以按照此说明进行操作。

  

scanf()系列函数从控制台或从控制台读取数据   FILE流,解析它,并将结果存储在变量中   在参数列表中提供。

     

格式字符串非常类似于printf()中的格式字符串   告诉它读取“%d”,例如对于int。但它也有   额外的功能,最值得注意的是它可以吃掉其他功能   您在格式字符串中指定的输入中的字符。

你应该写:

int main()
{
    int m,i,sum,num;

    i=0;
    sum=0;
    scanf("%d",&m);
    while(i<m){
        scanf("%d",&num);

        sum=sum + num;

        i=i+1;
        printf("Value of sum= %d\n",sum);
        //continue;
    }
    printf("Sum= %d ",sum);
}

答案 3 :(得分:0)

重构的代码将如下所示

#include <stdio.h>

int main() {
    int m, num, sum = 0;
    scanf("%d", &m);    // Let scanf automatically skip whitespace
    while (m--) {
        scanf("%d", &num);
        sum += num;
    }
    printf("Sum= %d\n", sum);
    return 0;
}