1554as 发表于 2019-11-16 00:17:02

萌新刚学到指针求助!!!

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


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

int main()
{
    char a;
    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前面的空格去掉求各位大佬指点指点

jackz007 发表于 2019-11-16 01:37:17

本帖最后由 jackz007 于 2019-11-16 01:42 编辑

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

main(void)
{
      char s , * p , c                                                         ;
      int e , i , k , m                                                               ;
      for(m = 0 ; ((c = getchar())!= '\n') ; s = c)                           ;
      s = '\0'                                                                     ;
      if(m > 0) {
                for(e = 0 , k = 0 ; k < m ; k ++) if(s >= '0' && s <= '9') e ++   ;
                for(p = s , k = 0 ; k < m && e > 0 ;) {
                        if(* (p + k) >= '0' && * (p + k) <= '9') {
                              c = * (p + k)                                           ;
                              for(i = k ; i < m - 1 ; i ++) * (p + i) = * (p + i + 1) ;
                              * (p + m - 1) = c                                       ;
                              e --                                                    ;
                        } else {
                              k ++                                                    ;
                        }
                }
                printf("%s\n" , s)                                                      ;
      }
}

编译、运行实况:

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

C:\Bin>x
this7is89@#hg
thisis@#hg789

C:\Bin>x
A234b57sdf&12ertyhj*&
Absdf&ertyhj*&2345712

C:\Bin>

hkh0068 发表于 2019-11-16 03:02:48

首先是代码的规范问题,函数的定义应该放在main函数的外面
第二,解题思路挺离谱的,看到这个题目怎么能是对输入的字符串中的每一个数字进行后移操作呢,应该是取出所有的数字放到原字符串的后面啊
你的代码我就没有细看了,肯定是存在逻辑错误的,最好是改一下思路

bin554385863 发表于 2019-11-16 09:31:52

本帖最后由 bin554385863 于 2019-11-16 13:24 编辑

#include <stdio.h>
#include <ctype.h>
#include <string.h>
char *strswap(char *str, char *ptr) //str是要处理的字符串, ptr用来保存最终结果
{
    char dstr = {'\0'}; //保存数字字符
    char cstr = {'\0'}; //保存其他字符
    int count_d = 0, count_s = 0;
    for (char *i = str; *i != '\0'; i++)
    {
      if (isdigit(*i))
      {
            dstr = *i;
            dstr = '\0';
            count_d++;
      }
      if (!isdigit(*i))
      {
            cstr = *i;
            count_s++;
      }
    }
    strcpy(ptr, cstr);
    strcat(ptr, dstr);
    return ptr;
}
int main()
{
    char str = {'\0'};
    char ptr;
    scanf("%s", str);
    printf("%s", strswap(str, ptr));
}
----------------------------------------------------------------------------------------------------
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>
页: [1]
查看完整版本: 萌新刚学到指针求助!!!