在C语言中将一个整数和一个字符转换成多种形式

4
在我的程序中,我需要:
  1. 询问用户一个数字,然后显示该数字,接着将其显示为十进制数、无符号八进制数、十六进制数、浮点数、保留两位小数的浮点数、保留三位小数的浮点数、带有带符号e和E的浮点数以及字符串。
  2. 对于字符也要做同样的操作。
我刚刚才学习了字符串,所以这里不涉及字符串。请告诉我可能会出现什么问题?
自从我修改了代码之后,当我通过字符来定义'%e'和'%o'时,我无法得到结果。
以下是我的原始代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int usernumber;

int main(void)
{
    int usernumber;
    puts("Please input a number of your choice:");
    scanf("%d", &usernumber);
    printf("%d %i %f %.2f %.3f %e %E", &usernumber);

    return 0;
}

这是我的新代码(于2014年10月28日修订):

int  usernumber ;
char usercharacter;

int main(void) 
{
   int (usernumber);
   int h1 = usernumber;
   int o1 = usernumber;
   int E1 = usernumber;
   int e1 = usernumber;
   char c1 = usernumber;
{
    puts("\n\n------------>Please input a number of your choice:");
    scanf( "%d",&usernumber);
    printf("%d %i %f %.2f %.3f ", usernumber, usernumber, (float) usernumber, (float) usernumber, (float) usernumber);
    printf(" %c"), c1;
    printf(" %X ", h1);
    printf(" %o ", o1);
    printf(" %E ", E1);
    printf(" %e \n ", e1);

}
   char (usercharacter);
   int h2 = usercharacter;
   int o2 = usercharacter;
   int E2 = usercharacter;
   int e2 = usercharacter;
   char c2 = usercharacter;
{
    puts("\n------------>Please input a character of your choice:");
    scanf( " %c",&usercharacter);
    printf("%d %i %f %.2f %.3f", usercharacter, usercharacter, (float) usercharacter, (float) usercharacter, (float) usercharacter);
    printf(" %c"), c2;
    printf(" %X ", h2);
    printf(" %o ", o2);
    printf(" %E ", E2);
    printf(" %e \n ", e2);

}

}

(10.30.14)

我再次更新了我的代码,使用了全新的格式。现在我遇到了麻烦,第二个函数无法正确处理第一个函数中的小数。虽然这个作业已经晚交了,我会因此失分,但出于好奇心,我仍在努力寻找解决方案。如果有人能提供任何建议或解释为什么会出现这种情况,请随意留言!

#include <stdio.h>
#include <stdlib.h>



int main(void)
{
char user_input[4200];       // The character string used to pull my integers from.
    {
    int input2integer;
    float input2float;
    puts("\n*----> Please input a number of your choice:  <----*");
    system("COLOR 2");
    scanf("%s", user_input);
    input2integer = atoi(user_input);  // Used to translate the character input into an integer.
    input2float = atof(user_input);    //Used to translate the character input into a float.
    printf("Your input was %s\nWhich could be interpreted in the following ways:\n", user_input);
    printf("int = %i\n", input2integer);
    printf("dec = %d\n", input2integer);
    printf("oct = %o\n", input2integer);
    printf("hex = %X\n", input2integer);
    printf("float = %f\n", input2float);
    printf("two digit float = %.2f\n", input2float);
    printf("three digit float = %.3f\n", input2float);
    printf("e float = %e\n", input2float);
    printf("E float = %E\n", input2float);
    printf("char = %c\n", input2integer);
    printf("string = %s\n", user_input);
    }

       char user_input_2[4200];
       {
       int input2integer_2;
       float input2float_2;
       puts("\n*----> Please input a character of your choice: <----*");
       system("COLOR 2");
       scanf("%s", user_input_2);//scans for a string and throws the value into the input array
       input2integer_2 = atoi(user_input_2);//converts the input array into an integer
       input2float_2 = atof(user_input_2);//converts the input array into a float
       printf("The Character selected was was %s\nThe Following are equivalent:\n", user_input_2);
       printf("int = %i\n", user_input_2);
       printf("dec = %d\n", user_input_2);
       printf("oct = %o\n", user_input_2);
       printf("hex = %X\n", user_input_2);
       printf("float = %f\n", input2integer_2);                 // Unfortunately, despite taking extra time on this,
       printf("two digit float = %.2f\n", input2integer_2);       // I failed to prevent this function from carrying the float from the one before.
       printf("three digit float = %.3f\n", input2integer_2);
       printf("e float = %e\n", input2integer_2);
       printf("E float = %E\n", input2integer_2);
       printf("char = %c\n", user_input_2);
       printf("string = %s\n", user_input_2);
       }
return (0);

(11.1.14)

这是该程序的最终版本,完美地运行起来了!

int main(void)
{
char user_input[4200];       // The character string used to pull my integers from.
    {
    int input2integer;
    float input2float;
    puts("\n*----> Please input a number of your choice:  <----*");
    system("COLOR 2");
    scanf("%s", user_input);
    input2integer = atoi(user_input);  // Used to translate the character input into an integer.
    input2float = atof(user_input);    //Used to translate the character input into a float.
    printf("Your input was %s\nWhich could be interpreted in the following ways:\n", user_input);
    printf("int = %i\n", input2integer);
    printf("dec = %d\n", input2integer);
    printf("oct = %o\n", input2integer);
    printf("hex = %X\n", input2integer);
    printf("float = %f\n", input2float);
    printf("two digit float = %.2f\n", input2float);
    printf("three digit float = %.3f\n", input2float);
    printf("e float = %e\n", input2float);
    printf("E float = %E\n", input2float);
    printf("char = %c\n", input2integer);
    printf("string = %s\n", user_input);
    }

       char user_input_2[4200];
       {
       int input2integer_2;
       double input2float_2;

       puts("\n*----> Please input a character of your choice: <----*");
       system("COLOR 2");
       scanf("%s", user_input_2);
       input2integer_2 = atoi(user_input_2);
       input2float_2 = atof(user_input_2);
       input2integer_2 = user_input_2[0]; // *THESE* two lines of code caused me more trouble than everything I have done in this class combined.
       input2float_2 = input2integer_2;   // After a few very sleepless nights, and a massive migraine from staring at screens, I figured them out.
       printf("The Character selected was was %s\nThe Following are equivalent:\n", user_input_2);
       printf("int = %i\n", input2integer_2);
       printf("dec = %d\n", input2integer_2);
       printf("oct = %o\n", input2integer_2);
       printf("hex = %X\n", input2integer_2);
       printf("float = %f\n", input2float_2);
       printf("two digit float = %.2f\n", input2float_2);
       printf("three digit float = %.3f\n", input2float_2);
       printf("e float = %e\n", input2float_2);
       printf("E float = %E\n", input2float_2);
       printf("char = %c\n", user_input_2[0]);
       printf("string = %s\n", user_input_2);
       }
return (0);
}

2
尝试使用以下代码:printf("%d %i %f %.2f %.3f %e %E", usernumber, usernumber, (double) usernumber, (double) usernumber, (double) usernumber, (double) usernumber, (double) usernumber); - chux - Reinstate Monica
请注意,您的全局变量未使用。在此程序中,您不需要<stdlib.h><string.h>。您似乎错过了八进制和十六进制格式(以及其他人诊断的问题)。您应该用换行符终止输出行。我有点好奇您打算如何将字符打印为浮点数。 - Jonathan Leffler
你说得对,我用以为可行的方法遇到了一些严重的错误。现在我必须把我的代码拆开来。 - Zach Ross
@JonathanLeffler 这些头文件是我的课程要求。在这个编辑中,我将它们删除以消除所有关于它们目的的困惑。 - Zach Ross
或许并非最终情况...你有一些全局变量被main()中的局部变量所隐藏。既然它们没有被使用,那么你可以将它们删除。局部变量更好;全局变量有时是必要的,但在这个程序中不需要。 - Jonathan Leffler
显示剩余6条评论
2个回答

7

如果你的编译器在第三次编译时没有告诉你出了什么问题,那么你需要换一个更好的编译器。GCC会在最少的刺激下告诉你有关多种错误的信息。这是一个简单的修复;你只需要确保为每个格式获取正确的类型,就像以前一样。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char user_input[4200];
    int input2integer;
    float input2float;
    puts("\n*----> Please input a number of your choice:  <----*");
    //system("COLOR 2");
    scanf("%s", user_input);
    input2integer = atoi(user_input);
    input2float = atof(user_input);
    printf("Your input was %s\nWhich could be interpreted in the following ways:\n", user_input);
    printf("int = %i\n", input2integer);
    printf("dec = %d\n", input2integer);
    printf("oct = %o\n", input2integer);
    printf("hex = %X\n", input2integer);
    printf("float = %f\n", input2float);
    printf("two digit float = %.2f\n", input2float);
    printf("three digit float = %.3f\n", input2float);
    printf("e float = %e\n", input2float);
    printf("E float = %E\n", input2float);
    printf("char = %c\n", input2integer);
    printf("string = %s\n", user_input);

    char user_input_2[4200];
    int input2integer_2;
    float input2float_2;
    puts("\n*----> Please input a character of your choice: <----*");
    //system("COLOR 2");
    scanf("%s", user_input_2);
    input2integer_2 = atoi(user_input_2);
    input2float_2 = atof(user_input_2);
    printf("The Character selected was was %s\nThe Following are equivalent:\n", user_input_2);
    printf("int = %i\n", input2integer_2);
    printf("dec = %d\n", input2integer_2);
    printf("oct = %o\n", input2integer_2);
    printf("hex = %X\n", input2integer_2);
    printf("float = %f\n", input2float_2);
    printf("two digit float = %.2f\n", input2float_2);
    printf("three digit float = %.3f\n", input2float_2);
    printf("e float = %e\n", input2float_2);
    printf("E float = %E\n", input2float_2);
    printf("char = %c\n", user_input_2[0]);
    printf("string = %s\n", user_input_2);

    return(0);
}

使用GCC进行编译(源文件xyz.c):

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition -Werror xyz.c -o xyz

示例运行(用户提供的数据为48和0):

*----> Please input a number of your choice:  <----*
48
Your input was 48
Which could be interpreted in the following ways:
int = 48
dec = 48
oct = 60
hex = 30
float = 48.000000
two digit float = 48.00
three digit float = 48.000
e float = 4.800000e+01
E float = 4.800000E+01
char = 0
string = 48

*----> Please input a character of your choice: <----*
0
The Character selected was was 0
The Following are equivalent:
int = 0
dec = 0
oct = 0
hex = 0
float = 0.000000
two digit float = 0.00
three digit float = 0.000
e float = 0.000000e+00
E float = 0.000000E+00
char = 0
string = 0

这是您版本3代码格式化版本和我发布的代码之间的统一差异。标有-的行是已删除的旧行;标有+的行是新插入的行。
--- xyz-bust.c  2014-10-30 21:39:38.000000000 -0700
+++ xyz-fixed.c 2014-10-30 21:12:29.000000000 -0700
@@ -33,16 +33,16 @@
     input2integer_2 = atoi(user_input_2);
     input2float_2 = atof(user_input_2);
     printf("The Character selected was was %s\nThe Following are equivalent:\n", user_input_2);
-    printf("int = %i\n", user_input_2);
-    printf("dec = %d\n", user_input_2);
-    printf("oct = %o\n", user_input_2);
-    printf("hex = %X\n", user_input_2);
-    printf("float = %f\n", input2integer_2);
-    printf("two digit float = %.2f\n", input2integer_2);
-    printf("three digit float = %.3f\n", input2integer_2);
-    printf("e float = %e\n", input2integer_2);
-    printf("E float = %E\n", input2integer_2);
-    printf("char = %c\n", user_input_2);
+    printf("int = %i\n", input2integer_2);
+    printf("dec = %d\n", input2integer_2);
+    printf("oct = %o\n", input2integer_2);
+    printf("hex = %X\n", input2integer_2);
+    printf("float = %f\n", input2float_2);
+    printf("two digit float = %.2f\n", input2float_2);
+    printf("three digit float = %.3f\n", input2float_2);
+    printf("e float = %e\n", input2float_2);
+    printf("E float = %E\n", input2float_2);
+    printf("char = %c\n", user_input_2[0]);
     printf("string = %s\n", user_input_2);
 
     return(0);

您说:
在这个例子中,您没有得到我想要的浮点效果; 然而我不知道为什么。
我不确定您正在指的是哪种浮点效果。但是,您可以观察到我针对每一个浮点格式都更改了printf()的参数。
我使用的编译器是Codeblocks,因为这是我的班级所使用的。 Code::Blocks是一种集成开发环境。它可以配置为使用不同的编译器。您还没有确定您使用的是哪种编译器和Code::Blocks一起使用。但是,如果您找不到使编译器报告代码中的错误的方法,请获取一个更好的编译器(并将其与Code::Blocks一起使用)。它支持的编译器之一是GCC;如果您当前使用的不是GCC,并且无法说服它拒绝您在更新3中发布的代码,请安装并配置GCC-除非有关“必须使用其他编译器”的愚蠢规则。但是,它支持的大多数编译器都可以设置为挑剔: 多编译器支持
  • GCC(MingW / GNU GCC)
  • MSVC++
  • clang
  • Digital Mars
  • Borland C++ 5.5
  • Open Watcom
MSVC++需要/ W3或类似的选项才能启用严格警告,如果我没记错的话。还有可能有更微妙的方法来设置警告,但是它会变得非常嘈杂,因为它认为标准C函数不安全。GCC和clang都将采取我展示的选项。我预计Digital Mars与GCC和clang相当但不同。我不知道Borland或Open Watcom编译器,但它们可能会被迫使用启用了严格警告的编译器。

1
Code::Blocks是一个集成开发环境(IDE),而不是编译器。它使用编译器;虽然您没有说使用哪个编译器。请查看我的更新。 - Jonathan Leffler
1
在查找了“统一差异(unified diff)”后,我开始明白你的意思了。现在你说的内容超出了我的理解范围。编译器提示我警告:'%e %f%E'(等等)期望的参数是“int”,但第二个参数类型为“char *”。 - Zach Ross
我应该将那段代码添加到我的程序中吗?还是这是一个选项设置? - Zach Ross
编译器不应该报告 %e 需要 int,而应该期望 double(在 printf() 等函数的参数列表中,float 值会自动提升为 double)。 - Jonathan Leffler
2
我很想把它移到聊天中,但是愚蠢的系统不允许我们这样做,因为你的声望不够。说“移动到聊天”是毫无意义的,因为它不会让我们这样做。也许我应该在 Meta 上再提交一个 bug(尽管我认为之前没有得到建设性的回应)。如果您键入“A”并使用我展示的代码(input2integer_2 = user_input_2[0]; input2float_2 = input2integer_2;),那么整数中将有65,浮点数中将有65.00。 - Jonathan Leffler
显示剩余12条评论

7

只有当您为每个格式说明符提供printf的参数时,格式说明符才有意义。

如果在printf字符串中有8个格式说明符,则需要在参数列表中有8个usernumber的出现。

printf("%d",    usernumber);
printf("%d %i", usernumber, usernumber);
...

此外,printf不像scanf那样使用其参数的地址。它不必写入它们。因此,对于printf,请按照上面所示删除&
请记住,您正在向printf提示传递的变量类型。由于printf()使用可变参数列表(未经类型化的列表),如果您传递与格式说明符提示不兼容的内容(例如用于%f的int或大小错误的变量),输出可能会出错。考虑将参数转换为临时变量。 (关于转换,请记住它仅生成一个转换值,而不更改原始变量)

好的,那个效果非常不错。但是我有一个问题,@codenheim,我的浮点数根本不起作用,它们只显示零值,你有什么想法吗? - Zach Ross
1
或者只是强制转换。 (float)usernumber - codenheim
1
一个问题:printf("char = %c\n", user_input_2); 是错误的,你不能像这样将 char 数组/指针格式化为%c。如果你使用 user_input_2[0],可以用%c打印/格式化数组中的第一个字符,但不能打印整个数组。 - codenheim
1
这些也是错误的:printf("int = %i\n", user_input_2);,以及在其之后打印user_input_2为不同数字格式的行也是不正确的。您可能想要使用input2integer_2input2float_2(记住,您不能将char数组传递给数字格式化程序,这就是为什么您需要先将其转换). - codenheim
1
如果你想聊天,我们可以离线聊天,而不是在帖子中聊天,但我现在得走了。(你可以通过发送电子邮件来引起我的注意,我的电子邮件在我的个人资料中) - codenheim
显示剩余7条评论

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