我正在尝试使用library(dplyr)
df %>%
group_by(pmin(a,b), pmax(a,b)) %>%
filter(n() >= 2) %>%
ungroup() %>%
select(a,b,d)
# Source: local data frame [7 x 3]
#
# a b d
# <dbl> <dbl> <fctr>
# 1 1 4 A
# 2 2 3 C
# 3 4 1 D
# 4 3 2 E
# 5 1 4 H
# 6 1 4 I
# 7 3 2 J
将整数转换为字符串,但它没有按预期工作。
当我输入一个数字时它工作正常,我可以在屏幕上显示数字。但是如果我输入一个字符串,它总是在屏幕上显示sprintf
。
我打算获取字符串,以便我可以使用"2"
函数检查它是否为数字。
也试过isdigit()
,但这几乎是同一个故事。
itoa()
如果我输入int main()
{
int num;
char string[31];
printf("Number: ");
scanf("%d",&num);
sprintf(string, "%d", num);
printf("%s", string);
return 0;
}
:它会显示2999
如果我输入"2999"
:它会显示"dog"
我怎样才能得到那个字符串?对于我所看到它应该工作,也许是我的IDE的东西?我有代码块16.01。
答案 0 :(得分:1)
我建议查看scanf
的返回值。它可能会返回零。它失败了并且没有在num
中存储值。 2
可能是程序启动时堆栈上的不确定值。
如果要读取输入的值,请使用fgets
将输入读入缓冲区,然后sscanf
将其解压缩。
答案 1 :(得分:1)
int num;
使num
未初始化。当您输入"dog"
时,scanf
操作与num
的任何内容都不匹配,因此不存储任何内容。因此,当您printf
num
时,它仍然未初始化,您获得的价值就是垃圾。
你可以通过检查scanf
的回报来测试。 scanf
将返回成功匹配的数量,如果输入了数字,您应该会1
printf("Number: ");
if (scanf("%d",&num) != 1) {
puts("You didn't enter a number!");
}
为了更好地证明它没有被设置,请尝试将num
初始化为某些内容并查看打印内容
#include <stdio.h>
int main() {
int num = 5; // I'm initializing to 5
char string[31];
printf("Number: ");
scanf("%d",&num);
sprintf(string, "%d", num);
printf("%s", string); // now this prints "5" if I input "dog"
return 0;
}
有关此问题的进一步证据,通过valgrind运行原始程序会打印出一些有关使用未初始化值的错误。我已经删除了下面的一些噪音:
$ echo "dog" | valgrind ./a.out
==32450==
==32450== Use of uninitialised value of size 8
==32450== at _itoa_word
==32450== by vfprintf
==32450== by vsprintf
==32450== by sprintf
==32450== by main
==32450==
==32450== Conditional jump or move depends on uninitialised value(s)
==32450== at vfprintf
==32450== by vsprintf
==32450== by sprintf
==32450== by main
要实现阅读字符串然后检查字符串的目标,您需要使用fgets
而不是
#include <stdio.h>
#include <ctype.h>
int main() {
char input[31];
printf("Number: ");
fgets(input, sizeof input, stdin); // read up to a line of input as a string
if (isdigit(input[0])) { // check if it's a number
puts("this is a number (or at least starts with one)");
} else {
puts("this is not a number");
return 1;
}
int num = 0;
char string[31];
sscanf(input, "%d", &num); // now you can do the scanf on the input string
sprintf(string, "%d", num);
printf("%s", string);
return 0;
}