sprintf将int复制到C中的字符串中

时间:2016-09-21 23:11:00

标签: c

我正在尝试使用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。

2 个答案:

答案 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;
}