鱼C论坛

 找回密码
 立即注册
查看: 1415|回复: 3

[已解决]萌新刚学到指针求助!!!

[复制链接]
发表于 2019-11-16 00:17:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:从键盘输入一个字符串,然后提取其中的数字字符,将其排列在其他字符之后。列如输入字符串this7is#@hg,排列后的结果为thisis$@hg789。要求字符串的操作有指针法实现。


这个是我的源代码不知道哪里错了或者逻辑错误
#include<stdio.h>

int main()
{
    char a[100];
    char *j;
    void swap(char *p,int n); // 定义一个让数字交换的函数
    int b ,k;
    gets(a);       //获得a数组的字符
    j = a;
    b = 0;
    for(k = 0 ; *(j + k) != '\0';k++)
    {

        b++;       //计算a数组输入的长度
    }
    swap(j , b);  
    for(k = 0 ; k <=b ; k++)
    {
        printf("%c",*(j + k));   //将交换的字符数组进行输出
    }
}

void swap(char *p, int n)
{
    char temp;
    int j ,k ;
    for(j = 0 ; j < n; j++)
    {
        for(k = 0 ; k < n - j; k++)  //利用类似气泡式的求法进行交换
        {

            if(*(p + k)>'0' && *(p + k)<'9')
            {
                temp = *(p + k);
                *(p + k ) = *(p + k + 1);     //一个一个往后挪动
                *(p + k + 1 ) = temp;

            }
        }
    }
}

这个是运行结果:
this7is89@#hg
thisis@#hg 987
Process returned 0 (0x0)   execution time : 11.617 s
Press any key to continue.

   该如何进行改进将那个9前面的空格去掉  求各位大佬指点指点
最佳答案
2019-11-16 09:31:52
本帖最后由 bin554385863 于 2019-11-16 13:24 编辑
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. char *strswap(char *str, char *ptr) //str是要处理的字符串, ptr用来保存最终结果
  5. {
  6.     char dstr[100] = {'\0'}; //保存数字字符
  7.     char cstr[255] = {'\0'}; //保存其他字符
  8.     int count_d = 0, count_s = 0;
  9.     for (char *i = str; *i != '\0'; i++)
  10.     {
  11.         if (isdigit(*i))
  12.         {
  13.             dstr[count_d] = *i;
  14.             dstr[count_d+1] = '\0';
  15.             count_d++;
  16.         }
  17.         if (!isdigit(*i))
  18.         {
  19.             cstr[count_s] = *i;
  20.             count_s++;
  21.         }
  22.     }
  23.     strcpy(ptr, cstr);
  24.     strcat(ptr, dstr);
  25.     return ptr;
  26. }
  27. int main()
  28. {
  29.     char str[100] = {'\0'};
  30.     char ptr[100];
  31.     scanf("%s", str);
  32.     printf("%s", strswap(str, ptr));
  33. }
复制代码

----------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-g4zw5ubg.qdp --stdout=Microsoft-MIEngine-Out-p5vusv2z.1x2 --stderr=Microsoft-MIEngine-Error-jnieekme.vlc --pid=Microsoft-MIEngine-Pid-sg2lylo3.inu --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
@#6a5$^5@8456fa5g
@#a$^@fag65584565

E:\Users\admin\Documents\VScode>cmd /C "c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-ze5m2hay.0jj --stdout=Microsoft-MIEngine-Out-ynus4vyd.gme --stderr=Microsoft-MIEngine-Error-k1ialc05.5si --pid=Microsoft-MIEngine-Pid-1rvgxj0s.znz --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi "
a5f45a45s4fdsd6f46
afasfdsdf545454646

E:\Users\admin\Documents\VScode>  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-16 01:37:17 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-16 01:42 编辑

    楼主试试这个代码:
  1. #include <stdio.h>

  2. main(void)
  3. {
  4.         char s[260] , * p , c                                                           ;
  5.         int e , i , k , m                                                               ;
  6.         for(m = 0 ; ((c = getchar())!= '\n') ; s[m ++] = c)                             ;
  7.         s[m] = '\0'                                                                     ;
  8.         if(m > 0) {
  9.                 for(e = 0 , k = 0 ; k < m ; k ++) if(s[k] >= '0' && s[k] <= '9') e ++   ;
  10.                 for(p = s , k = 0 ; k < m && e > 0 ;) {
  11.                         if(* (p + k) >= '0' && * (p + k) <= '9') {
  12.                                 c = * (p + k)                                           ;
  13.                                 for(i = k ; i < m - 1 ; i ++) * (p + i) = * (p + i + 1) ;
  14.                                 * (p + m - 1) = c                                       ;
  15.                                 e --                                                    ;
  16.                         } else {
  17.                                 k ++                                                    ;
  18.                         }
  19.                 }
  20.                 printf("%s\n" , s)                                                      ;
  21.         }
  22. }
复制代码


编译、运行实况:

  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. this7is89@#hg
  4. thisis@#hg789

  5. C:\Bin>x
  6. A234b57sdf&12ertyhj*&
  7. Absdf&ertyhj*&2345712

  8. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-16 03:02:48 | 显示全部楼层
首先是代码的规范问题,函数的定义应该放在main函数的外面
第二,解题思路挺离谱的,看到这个题目怎么能是对输入的字符串中的每一个数字进行后移操作呢,应该是取出所有的数字放到原字符串的后面啊
你的代码我就没有细看了,肯定是存在逻辑错误的,最好是改一下思路
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-16 09:31:52 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 bin554385863 于 2019-11-16 13:24 编辑
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. char *strswap(char *str, char *ptr) //str是要处理的字符串, ptr用来保存最终结果
  5. {
  6.     char dstr[100] = {'\0'}; //保存数字字符
  7.     char cstr[255] = {'\0'}; //保存其他字符
  8.     int count_d = 0, count_s = 0;
  9.     for (char *i = str; *i != '\0'; i++)
  10.     {
  11.         if (isdigit(*i))
  12.         {
  13.             dstr[count_d] = *i;
  14.             dstr[count_d+1] = '\0';
  15.             count_d++;
  16.         }
  17.         if (!isdigit(*i))
  18.         {
  19.             cstr[count_s] = *i;
  20.             count_s++;
  21.         }
  22.     }
  23.     strcpy(ptr, cstr);
  24.     strcat(ptr, dstr);
  25.     return ptr;
  26. }
  27. int main()
  28. {
  29.     char str[100] = {'\0'};
  30.     char ptr[100];
  31.     scanf("%s", str);
  32.     printf("%s", strswap(str, ptr));
  33. }
复制代码

----------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-g4zw5ubg.qdp --stdout=Microsoft-MIEngine-Out-p5vusv2z.1x2 --stderr=Microsoft-MIEngine-Error-jnieekme.vlc --pid=Microsoft-MIEngine-Pid-sg2lylo3.inu --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
@#6a5$^5@8456fa5g
@#a$^@fag65584565

E:\Users\admin\Documents\VScode>cmd /C "c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-ze5m2hay.0jj --stdout=Microsoft-MIEngine-Out-ynus4vyd.gme --stderr=Microsoft-MIEngine-Error-k1ialc05.5si --pid=Microsoft-MIEngine-Pid-1rvgxj0s.znz --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi "
a5f45a45s4fdsd6f46
afasfdsdf545454646

E:\Users\admin\Documents\VScode>  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 15:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表