我已经开始了使用 C 语言的编程入门课程,我们的任务是制作一个程序,该程序从用户处获取 5 位数字,例如
12345
,并将其打印为 1 2 3 4 5
。
我试图在谷歌上寻求帮助,但考虑到课程刚刚开始,所有给出的答案都使用了代码,对于我的理解来说太复杂了,我们只学习了
printf
和scanf
,if
和switch
语句和while
和 for
循环。
我尝试将所有给出的数字放入单独的
int
变量中,这使程序停止,然后尝试将它们放入字符中,但测试程序说这是错误的,因为我们应该使用int
。
有没有简单的方法可以做到这一点?
编辑:
我尝试过的:
#include <stdio.h>
int main(void) {
int num1,
num2,
num3,
num4,
num5;
printf("Give 5 digit number > ");
scanf("%d%d%d%d%d", &num1, &num2, &num3, &num4, &num5);
printf("Seperated number is %d %d %d %d %d", num1, num2, num3, num4, num5);
return (0);
}
也尝试过该代码,但使用
char
变量类型,但这是不允许的,它必须是 int
。
测试程序给出了预期输出,对于
00001
是 Given number 1 seperated is 0 0 0 0 1
或对于 -12321
是 Given number -12321 seperated is -1 -2 -3 -2 -1
printf("%c ", input_from_user[i]);
我想这里的重点是理解 C 如何存储东西。您正在读取字符(即一组通常显示为字母的 8 字节值)并将每个字符转换为整数(通常是存储数字的 32 位值)
因此,您想使用 scanf 读取输入以获取 5 位数字的字符串,然后使用 for 循环遍历每个数字,从字符串中读取单个字符并将其转换为整数变量。然后 printf 该变量加一个空格,然后继续重复下一个数字。
如果您一一读取数字,那就更容易了,因为您只需要 for 循环来读取、转换和打印所读取的每个数字。
根据问题,您将获得一个 5 位数字,然后您还必须打印该数字的数字。
因此,在您的程序中,您单独采用了五位数字作为输入,对我来说这似乎是错误的。我在下面给出我的解决方案:
#include <stdio.h>
int main(void)
{
int num,idx=0,i=0;
int arr[5]; // for storing the five digits;
scanf("%d",&num);
while(num){ //loop will terminate when the num = 0
int digit = num%10;
num = num/10;
arr[idx] = digit;
idx++;
}
//Printing from the last, as the digit are stored in reverse order.
for(int i=4;i>=0;i--){
printf("%d ",arr[i]);
}
return 0;
}
我不太明白这个练习的目的。如果你正在学习 C,你应该学习的最后一个函数是
scanf
。令人难以置信的是,这么多人很早就开始教授它。尽量不要使用 scanf,直到您足够了解该语言并意识到您可能永远不需要它。也就是说,我认为练习的目的是做类似的事情:
#include <stdio.h>
int
main(void)
{
unsigned num;
char buf[6];
printf("Give 5 digit number > ");
if( scanf("%u", &num) != 1 || num > 99999 ) {
fprintf(stderr, "Invalid input\n");
return 1;
}
printf("Separated number is");
snprintf(buf, sizeof buf, "%d", num);
for( int i = 0; buf[i]; i++ ) {
printf(" %c", buf[i]);
}
putchar('\n');
return 0;
}
虽然可能超出了 OP 的阶段,但代码可以使用递归来打印从最高有效到最低有效的值。
#include <stdio.h>
void print_digit(int n, int depth) {
if (depth > 1) print_digit(n/10, depth - 1); // print "left" digits first
printf(" %d", n%10);
}
void print_5(int n) {
// To do: checking for correct spelling
printf("Given number %d seperated", n); // or separated
print_digit(n, 5);
printf("\n");
}
int main(void)
{
print_5(1);
print_5(-12321);
return 0;
}
输出
Given number 1 seperated 0 0 0 0 1
Given number -12321 seperated -1 -2 -3 -2 -1
您可以通过限制每个数字读取的字节数来使用您的方法:
#include <stdio.h>
int main(void) {
int num1, num2, num3, num4, num5;
printf("Give 5 digit number > ");
if (scanf("%1d%1d%1d%1d%1d", &num1, &num2,&num3, &num4, &num5) == 5) {
printf("Separated number is %d %d %d %d %d\n", num1, num2, num3, num4, num5);
}
return 0;
}
但请注意,这可能不是您应该做的。您应该读取一个数字并将其分解为五位数字:
#include <stdio.h>
int main(void) {
int num;
printf("Give 5 digit number > ");
if (scanf("%d", &num) == 1 && num >= 10000 && num <= 99999) {
printf("Separated number is %d %d %d %d %d\n",
num / 10000, num / 1000 % 10, num / 100 % 10, num / 10 % 10, num % 10);
}
return 0;
}