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的总和。
答案 0 :(得分:2)
正如其他人(@ BLUEPIXY和@BillDoomProg)已在评论中指出的那样,您的问题是scanf
格式字符串中的空格。另请查看this answer。
更改scanf
格式字符串:
scanf("%d ",&m);
...
scanf("%d ",&num);
要:
scanf("%d", &m);
...
scanf("%d", &num);
只需删除空格即可。
格式字符串由一系列指令(...)
组成指令是以下之一:
一系列空格字符(空格,制表符,换行符等;请参阅 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并开始尝试匹配空格。得到NL
和EOL
。控件仍然使用此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)
这是因为%d
行scanf
之后有空格。
更改
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;
}