Draw-Ranger 发表于 2021-9-9 17:39:39

如何将数字串分段输出

如何利用C语言实现数字串的拆分?
如将学号2021308310107拆分为2021 3083 101 07输出。
求助各位大佬!!!!

wp231957 发表于 2021-9-9 17:56:53

这东西还是脚本语言强项

大马强 发表于 2021-9-9 18:36:53

我只能想到用4个数组来接收
因为学号格式是已知的,第一个数组赋值前4位,第二个数组赋值第4位到第8位,以此类推

人造人 发表于 2021-9-9 19:44:42

#include <stdio.h>

int main(void) {
    const char *str = "2021308310107";
    size_t id;
    sscanf(str, "%4lu%4lu%3lu%2lu", &id, &id, &id, &id);
    printf("%04lu\n", id);
    printf("%04lu\n", id);
    printf("%03lu\n", id);
    printf("%02lu\n", id);
}

Max472 发表于 2021-9-9 19:55:27

大马强 发表于 2021-9-9 18:36
我只能想到用4个数组来接收
因为学号格式是已知的,第一个数组赋值前4位,第二个数组赋值第4位到第8位,以 ...

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

#define MAX 1024

int main()
{
    int sno_group;   // 分为 4 段,所以数组为 4 行,因为有很多学生,所以列数设置的大一点
    char sno;      //学号有13位,用字符串保存的话,输入的数据最后需要加一个 "\0"表示到此结束,所以该数组长度设置为14
    int i, j;

    i = j = 0;

    do {
      scanf("%s", sno);
      if ("end" != sno)
      {
            int row = i;
            char temp = {""};
            strncpy(temp, sno, 4);
            temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+4, 4);
            temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+8, 3);
            temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+11, 2);
            temp = '\0';
            sno_group = atoi(temp);

            j++;                // 换一列
      }

    } while ("end" != sno);


    printf("%d %d %d %d\n", sno_group, sno_group, sno_group, sno_group);

}

我根据你说的写的代码,有点问题,你能帮忙改改吗

大马强 发表于 2021-9-9 20:34:52

Max472 发表于 2021-9-9 19:55
我根据你说的写的代码,有点问题,你能帮忙改改吗

还是人造人大佬写得好
我就小改了一点
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 1024

int main()
{
    int sno_group;   // 分为 4 段,所以数组为 4 行,因为有很多学生,所以列数设置的大一点
    char sno,ch;      //学号有13位,用字符串保存的话,输入的数据最后需要加一个 "\0"表示到此结束,所以该数组长度设置为14
    int i, j;

    i = j = 0;

    do {
      scanf("%c %s",&ch,sno);
      getchar();// 接收回车 ,上次输入的回车会赋值给下一次ch
      if (ch != 'n')
      {
            int row = i;
            char temp = {""};
            strncpy(temp, sno, 4);
            temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+4, 4);
            temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+8, 3);
            temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+11, 2);
            temp = '\0';
            sno_group = atoi(temp);

//            j++;                // 换一列先不要加一,你下面都没有用迭代打印结果
      }

    } while (ch != 'n');

        //需要用迭代打印
    printf("%d %d %d %d\n", sno_group, sno_group, sno_group, sno_group);

}

jhq999 发表于 2021-9-9 22:20:40

本帖最后由 jhq999 于 2021-9-9 22:36 编辑


int main()
{
   _int64 a=0;
   scanf("%I64d",&a);
   printf("%04I64d,%04I64d,%03I64d,%02I64d",a/1000000000,(a%1000000000)/100000,(a%100000)/100,a%100);
   getchar();
   return 0;
}

Max472 发表于 2021-9-10 07:59:40

本帖最后由 Max472 于 2021-9-10 08:05 编辑

大马强 发表于 2021-9-9 20:34
还是人造人大佬写得好
我就小改了一点

我改了一下,但是我还是设置的输入 end 退出输入,但是即使变量 sno 等于 end 还是不满足了 if ( "end" != sno )

这是什么情况?



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

#define MAX 1024

int main()
{
    int sno_group;   // 分为 4 段,所以数组为 4 行,因为有很多学生,所以列数设置的大一点
    char sno;      //学号有13位,用字符串保存的话,输入的数据最后需要加一个 "\0"表示到此结束,所以该数组长度设置为14
    int i, j;
    int row, line;
    char temp = { "" };

    i = j = 0;

    row = i;
    line = j;


    do {
      scanf("%s", sno);
      getchar();

      if ("end" != sno)
      {
            row = i;
            
            strncpy(temp, sno, 4);
            //temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+4, 4);
            //temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+8, 3);
            temp = '\0';
            sno_group = atoi(temp);

            strncpy(temp, sno+11, 2);
            temp = '\0';
            sno_group = atoi(temp);

            line++;                // 换一列
      }

    } while ("end" != sno);

   
    for (i = 0; i < row; i++)
      for (j = 0; j < line; j++)
            printf("%d %d %d %d\n", sno_group, sno_group, sno_group, sno_group);

    return 0;

}

大马强 发表于 2021-9-10 08:27:04

我在dev上调试
son = "END\000\000\000\000\000\000\000\000\000\000"
后面还有11个位置没有被填充
然后我再做这个实验
https://static01.imgkr.com/temp/c03e18d8752d4d1b8f55379fea3280bd.jpg
说明数组长度也要相同,"end" 就相当于一个 a

Max472 发表于 2021-9-10 08:36:34

大马强 发表于 2021-9-10 08:27
我在dev上调试
son = "END\000\000\000\000\000\000\000\000\000\000"
后面还有11个位置没有被填充


哦,应该用 ,之前我遇到过这个问题,不怎么用忘了{:10_277:}
if ( 0 == strcmp(a, b) )

大马强 发表于 2021-9-10 09:15:04

Max472 发表于 2021-9-10 08:36
哦,应该用 ,之前我遇到过这个问题,不怎么用忘了

可能在strcmp()函数里面就会将长的一方截断/0来比较
这样两者就相等了

Max472 发表于 2021-9-10 09:27:18

大马强 发表于 2021-9-10 09:15
可能在strcmp()函数里面就会将长的一方截断/0来比较
这样两者就相等了

Draw-Ranger 发表于 2021-9-13 10:32:50

Max472 发表于 2021-9-9 19:55
我根据你说的写的代码,有点问题,你能帮忙改改吗

我是初学者 那天老师留的作业将学号按照各段的特定含义进行切分感觉你的思路应该没问题非常感谢您的热心帮助

Max472 发表于 2021-9-13 12:31:36

本帖最后由 Max472 于 2021-9-13 17:12 编辑

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

#define MAX 1024

int main()
{
    char sno_group{
      {"", },
      {"", },
      {"", },
      {"", },
    };   // 分为 4 段,所以数组为 4 行,因为有很多学生,所以列数设置的大一点,最后的 表示字符串,分离出来的数据段就是存在这个 里边
    char sno;      //学号有13位,用字符串保存的话,输入的数据最后需要加一个 "\0"表示到此结束,所以该数组长度设置为14
    int i, j;
    int row, line;
    char temp = { "" };

    i = j = 0;

    row = i;
    line = j;


    do {
      scanf("%s", sno);
      getchar();

      if ( strcmp("end", sno) )
      {
            row = i;
            
            strncpy(sno_group, sno, 4);
            temp = '\0';
            //strcpy(sno_group, temp);
            

            strncpy(sno_group, sno+4, 4);
            //temp = '\0';
            //strcpy(sno_group, temp);

            strncpy(sno_group, sno+8, 3);
            //temp = '\0';
            //strcpy(sno_group, temp);

            strncpy(sno_group, sno+11, 2);
            //temp = '\0';
         //strcpy(sno_group, temp);

            line++;                // 换一列
      }

    } while ( strcmp("end", sno) );

   
    for (j = 0; j < line; j++)
    {
      for (i = 0; i < row; i++)
      {
            printf("%s ", sno_group);
      }
      putchar('\n');
    }
            

    return 0;

}
页: [1]
查看完整版本: 如何将数字串分段输出