在C语言中使用sscanf将字符转换为整数

3

我正在学习C语言,但sscanf让我很头疼。我的程序将八进制数转换为十进制数:

void OktalToDecimal(char str[]) {
  char character;
  int digit;
  int result = 0;

  int i;
  for (i = 0; i<strlen(str); i++){
      character = str[strlen(str) - 1 - i]; //from right to left
      printf("%c", character);
      sscanf(character, "%i", digit); //converting char to int

      //result += digit * pow(8,i);
  }

  //printf("decimal: %d \n", result);
}

int main () {
  char oktal[256] = { "361 oktal" };

  char digit[20];
  char format[20];
  sscanf (oktal, "%s %s", digit, format);

  if (strcmp (format, "oktal") == 0) {
    OktalToDecimal(digit);
  }

  return 0;
} 

我的程序出现错误

sscanf(character, "%i", digit); //converting char to int

我不知道为什么。是否需要帮助? 谢谢。

1
你需要指定目标整数的地址。只需使用 sscanf(character, "%i", &digit); - Roberto Caboni
1
OktalToDecimal 函数中,应该使用 sscanf(character, "%i", &digit);。变量 digit 在这两个函数中有不同的类型。在 main 函数中,它是一个数组,因此在传递给 sscanf 时不需要使用 & - Weather Vane
2
@WeatherVane 这两个变量具有相同的名称但意义不同。这是一个值得怀疑的选择,但并不是错误。 - Roberto Caboni
1
@RobertoCaboni 我并没有说是这样的:错误在于以相同方式将它们传递给 sscanf,而不是拥有相同的名称。 - Weather Vane
OP 也可以使用 for (i = strlen(str)-1; i >= 0; i--) 从右到左更简单地遍历字符串。 - Weather Vane
显示剩余2条评论
1个回答

1

My programm gets an error on

sscanf(character, "%i", digit); //converting char to int

sscanf(character, "%i", digit); //converting char to int
"

character 是一个 char 类型,不是一个以 null 字符结尾的 string,因此不能被 sscanf 函数所需求。

将数字字符转换成相应的值,只需要将其减去 '0'。

"
digit = character - '0';

但在确定它是数字时,您可以使用函数isdigit进行操作,在您的情况下,您还可以检查是否有八进制,因此要检查字符是否介于“0”和“7”之间。除此之外,我鼓励您检查sscanf(oktal,“%s%s”,digit,format)返回2以确保用户输入了您期望的两个字符串。

根据你的话

我被迫使用sscanf

在这种情况下,您可以修改字符(variable name)的声明为:

char character[2];

在循环之前添加终止空字符以完成字符串:
character[1] = 0;

在循环中替换。
 character = str[strlen(str) - 1 - i]; //from right to left
 printf("%c", character);
 sscanf(character, "%i", digit); //converting char to int

通过

  character[0] = str[strlen(str) - 1 - i]; //from right to left
  printf("%c", character[0]);
  sscanf(character, "%i", &digit); //converting char to int

因为 strlen(str) 在循环中不会改变,所以建议您将其值保存在一个变量中并在循环中使用。请注意,您也可以让 istrlen(str) - 1 开始以简化操作:
for (i = strlen(str) - 1; i >= 0; i--){ //from right to left
  character[0] = str[i]; 
  ...

你好,感谢你的帮助。"digit = character - '0'" 这个方法很好用,但是我必须使用 sscanf。如果我使用 "sscanf(character, "%i", &digit);" 就会出现分段错误。 谢谢你的其他建议,我会在解决第一个问题后尽快实现它们。 - AndreasInfo
@AndreasInfo 我修改了我的回答。 - bruno
非常感谢。它使用'\0'来终止字符串。此外,在“sscanf(character, "%i", &digit);”中使用&digit。我仍然对一些基础知识(指针)感到困惑,但现在我有一个可以思考的解决方案。再次感谢。 - AndreasInfo
@AndreasInfo 你说得对,它必须是 *"sscanf(character, "%i", &digit);"*,抱歉我忘记加上"&"。为了让 sscanf 把值保存在 digit 中,它需要其地址,"&" 就是起到这个作用的。 - bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接