如何在C语言中将一个整数分成多个位数整数?

3
我正在尝试自学C语言。 我想将一个整数拆分成多个单独的整数,例如将12345拆分为12、34和5,但我找不到方法来实现它。
我已经了解了一些Java和编程基础知识。我需要使用do-while或for循环来完成这个任务吗?还是可以使用一个整数类型的数组?

sprintf()吗?C并没有你所期望的那种功能,它没有特定的函数来处理十进制数。 - EOF
我认为你的意思是“分割”,而不是“拼接”——它们是相反的操作。 - clearlight
所以你有一个 int,想要几个 int?那么如何进行一些简单的数学运算呢?(整数除法和取模)?如果不是这种情况,请澄清并展示代码。 - user2371524
@nerdistcolony 基于位置的 - 它需要分离为2-2-4。并且始终带有8位数字。因此,输入12345678需要分成12、34和5678。 - Mukul Ram
@MukulRam 好的,我会更新我的回答以适应12345678。 - clearlight
显示剩余3条评论
3个回答

2
这个动态地实现了您所需要的功能!您可以设置任何类型的分割方式。2-2-4或3-4-5或其他任何组合。(您基本上可以从用户那里获取数字字符串并完成此任务,稍后可以将临时字符串转换为整数):
#include <stdio.h>
#include <string.h>

int main() {
    int i; //Counter

    char getStr[100];
    int NumberToSplit1, NumberToSplit2, NumberToSplit3;

    printf("Enter a number: ");
    scanf("%s", getStr);    //get it as a string
    //or you can use scanf("%[^\n], getStr);

    printf("How many number splits you want: ");
    scanf("%d %d %d", &NumberToSplit1, &NumberToSplit2, &NumberToSplit3);

    printf("\n%d-%d-%d split: \n", NumberToSplit1, NumberToSplit2, NumberToSplit3);

    for (i = 0; i < NumberToSplit1; i++) {
        printf("%c", getStr[i]);
    }
    printf("\n");
    for (i = NumberToSplit1; i < (NumberToSplit1+NumberToSplit2); i++) {
        printf("%c", getStr[i]);
    }
    printf("\n");
    for (i = (NumberToSplit1+NumberToSplit2); i < (NumberToSplit1+NumberToSplit2+NumberToSplit3); i++) {
        printf("%c", getStr[i]);
    }

    //If you want to save it in an integer, you can use strcat function to save the temp 2 numbers in a string convert that to integer

    //or use https://dev59.com/NWw05IYBdhLWcg3wy052

    printf("\n");
    printf("\n");

}

输出:

Enter a number: 12345
How many number splits you want: 2 2 4

    2-2-4 split: 
    12
    34
    5

Program ended with exit code: 0

1
否则,首先将int转换为字符串:

 #include <stdio.h>
 int n = 12345678;
 int len = snprintf(NULL, NULL, "%d", n);
 char *digits = malloc(len);
 sprintf(digits, "%d", n);

那么你可以以多种方式拆分字符串,例如:

 int a, b, c;
 sscanf(digits, "%2d%2d%4d", &a, &b, &c);

或者:

 char sa[2], sb[2], sc[4];
 char *cp = digits;
 sa[0] = *cp++;
 sa[1] = *cp++;
 sb[0] = *cp++;
 sb[1] = *cp++;
 sc[0] = *cp++;
 sc[1] = *cp++;
 sc[2] = *cp++;
 sc[3] = *cp++;

 printf("%2c %2c %4c\n", sa, sb, sc);

或者:

 // Create 3 buffers to hold null-terminated ('\0' terminated) strings
 char sa[3] = { 0 } , sb[3] = { 0 }, sc[4] = { 0 };

 char *cp = digits;
 sa[0] = *cp++;
 sa[1] = *cp++;
 sb[0] = *cp++;
 sb[1] = *cp++;
 sc[0] = *cp++;
 sc[1] = *cp++;
 sc[2] = *cp++;
 sc[3] = *cp++;

 printf("%s %s %s\n", sa, sb, sc);

然后释放你的内存:

 free(digits);

等等...

等等... 等等...

1

如果您想将一个八位数分成2-2-4的形状,只需使用整数除法和模数即可。
假设您不想要任何负号:

void split( int input, int output[3] )
{
  if ( input<0 )
    input = -input;
  output[0] = input % 10000;
  output[1] = ( input / 10000 ) % 100;
  output[2] = input / 1000000;
}

你在评论中说它是基于位置的,而不是基于算术的。针对基于位置的问题,由于只有一种情况,用算术来解决反而会变得奇怪。所以你需要非常清晰和明确,以便人们不会走错方向浪费时间。我通常解决通用情况,但由于这只是一个教育性的练习,没有实际价值,它并没有解决为什么要在那些边界上分割数字、数据从哪里获取、是否存在其他情况以及位置和字段大小是否发生了变化等问题。解决这个问题有很多方法,但所有的背景信息都需要提供。 - clearlight
@nerdistcolony 很抱歉,应该是位置的问题。这个数学方法可以得到2-2-4的组合。基本上我正在解决随机练习题。在这个当前的问题中,我需要 -1)提示用户输入一个整数2)接受一个整数并将其值归属于一个变量3)将整数例如12345678分成三个不同的整数12、34和5678。4)然后有一些与将它们转换为mm/dd/yyyy以及找出日期对应的日期相关的数学计算,但这不是我需要帮助的地方。我的问题是我不知道基本语法。 - Mukul Ram
@nerdistcolony 我还没有。我刚开始上大学,想尝试尽可能多的编程语言。你会推荐它吗? - Mukul Ram
@Mukul。不,这样不行。只需编译并执行即可自行查看。尽管您的想法不错,但您只需要对代码进行一些调整即可。 - Anonymous Coward
@JoseAntonioDuraOlmos 我明白我的错误了。谢谢。 - Mukul Ram
显示剩余3条评论

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