| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2435 人关注过本帖
标题:怎么在每个单词字母逆序中让标点符号的位置保持不变?
只看楼主 加入收藏
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1509
专家分:9241
注 册:2010-3-16
收藏
得分:0 
回复 9楼 Sopphhiiaa
疏忽了,代码修改过了,你看一下

主循环还可以写成这种方式
程序代码:
while (*p)
    {
        if (isspace(*p) || ispunct(*p))
        {            
            b = 0;
        }
        else if(isalnum(*p))
        {
            if (b == 0)
                start = p;
            if(isspace(*(p + 1)) || ispunct(*(p + 1)) ||*(p + 1) == '\0')
            {
                end = p;
                restr(start, end);
            }
            b = 1;
        }
        p++;
    }



[此贴子已经被作者于2020-12-24 23:57编辑过]

2020-12-24 23:46
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
收藏
得分:0 
回复 11楼 apull
您刚才的代码还是有一点小问题
比如我随便输入以下例子
ashk; ;wjs' wsl/
khsa; ;sjw' /lsw 这里标点符号就换了

dskh;; ajl' ,sj'//sj ;sdk'
hksd;; lja' ,js'//j 这里到后面就没有了

虽然我还不太看得懂您写的代码,但是您最后写的新的循环主体运行结果是正确的,感谢!
祝您圣诞节快乐!

[此贴子已经被作者于2020-12-25 00:15编辑过]

2020-12-25 00:07
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
回复 12楼 Sopphhiiaa
哈哈,是我看错了,以为你是从数组头开始读的。所以算法就写错。现我贴出代码,请你参考。
我的设计的原理是,先算出非字母的字符数,然后进行数组移位,经过调试,结果是对的
因为你的数组是20个字符,而且非字母字符也不管是否是逆序,哈,所以结果有图
#include <stdio.h>
#include <string.h>
int main(void)
{
   
    char a[20];

    int len;
    int p,q;
    char c[20][20];
    char d[20];
    char b[20][20];
    int i,j,k;
    int m[20];
    int aa=0;/*计算非字母字符的数量*/
    char temp;/*数组移位的临时存储变量*/
    j=0;
    k=0;
    gets(a);
    len=strlen(a);
    for(i=0;i<len;i++)
    {
        if(a[i]==' ')
        {
            j++;
            
            k=0;
            continue;
        }
        
        b[j][k]=a[i];
        k++;
        m[j]=k;
    }
    /*int t;
    for(t=0;t<j+1;t++)
    printf("%d\n",m[t]);*/
   

    for(p=0;p<j+1;p++)
    {      aa=0;/*初始化为零,因为每一个字符串都可能存在非字母字符*/

        for(q=0;q<m[p];q++)
        {
                c[p][q]=b[p][m[p]-1-q];/*先不管字母或非字母,都按逆序存储*/
        
            if(b[p][m[p]-1-q]>='a'&&b[p][m[p]-1-q]<='z'||b[p][m[p]-1-q]>='A'&&b[p][m[p]-1-q]<='Z') ;
            else
              aa++;/*这里是计算非字母字符数*/



            
        }
        if(aa>0)/*如果存在非字母字符则进行数组移位,每移动一次最终把头接到尾*/
        {
           for(q=0;q<aa;q++)
           {         temp=c[p][0];
                 for(j=0;j<m[p]-1;j++)
                  {
                     c[p][j]=c[p][j+1];
                  }
                  c[p][j]=temp;

                }
          }


    }
         p=0;
         while(p<j+1)
          {
            for(q=0;q<m[p];q++)
           {
           printf("%c",c[p][q]);
           }
           p++;
           printf(" ");
          }
   
      getch();/*这个你可以删除,这是wintc里加的调试函数*/
    return 0;
   
   
}
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2020-12-25 09:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:4 
这题目限定了输入字符串的最大长度了吗?否则main函数没法写,我定义char a[20],你可能输入21个字符;我定义char a[2000000000000000000],你可能输入2000000000000000001个字符,……
字母逆序标点不变,那数字等其它字符呢?这样,我把判断字母/标点的函数独立出来,你可以按需修改

程序代码:
#include <stdio.h>

inline int is_alpha( int ch )
{
    return (ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z');
}
inline int is_punct( int ch )
{
    return ch!=0 && !is_alpha(ch);
}

char* foo( char* s )
{
    for( char *a,*b=s; *b; )
    {
        for( a=b; is_punct(*a); ++a );
        for( b=a; is_alpha(*b); ++b );
        for( size_t i=0; a+2*i+1<b; ++i )
        {
            char t = *(a+i);
            *(a+i) = *(b-i-1);
            *(b-i-1) = t;
        }
    }
    return s;
}

int main( void )
{
#define TEST(a) {char s[]=a; puts(s), foo(s), puts(s), putchar('\n');}
    TEST( "I like thinking..." );
    TEST( "ashk; ;wjs' wsl/" );
    TEST( "dskh;; ajl' ,sj'//sj ;sdk'" );
    TEST( "   a ab abc   " );
    TEST( "a ab abc" );
#undef TEST
}
2020-12-25 10:39
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
要讲武德
图片附件: 游客没有浏览图片的权限,请 登录注册

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

int isa(char ch)
{
  if( (ch>='A'&&ch<='Z') || (ch>='a'&&ch<='z'))
  return 1;
  else
  return 0;
}
int main(void)
{
   
   char str[100];
   char a[100];
   int i=0,j=0,len=0;
   int k=0,c=0,d=0;
   char temp;
   gets(a);
   len=strlen(a);

   for(i=0;i<len;i++)
    {

      str[i]=a[i];
      if(isa(a[i])==1)
      {
         k++;
      }
      if( (isa(a[i+1])==0)&&k>0  )
      {      c=i;
             d=k;

        for( j=0;j<(k/2);j++)
          {  temp=str[c];
             str[c]=str[c-d+1] ;
             str[c-d+1]=temp;
             c--;
             d=d-2;
           }
           k=0;
      }
    }
     for(i=0;i<len;i++)
    printf("%c",str[i]);
    getch();
   }

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2020-12-25 11:59
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
收藏
得分:0 
回复 13楼 do8do8do8
很奇怪 我运行这个程序根本没有输出结果
2020-12-25 14:31
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
收藏
得分:0 
回复 14楼 rjsp
好的,感谢!
祝您圣诞节愉快!
2020-12-25 14:31
Sopphhiiaa
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2020-12-7
收藏
得分:0 
回复 15楼 do8do8do8
你这个代码运行出来是对的 不过我还需要自己再理解一下
谢谢你抽出时间为我解答问题,祝您圣诞节快乐!
2020-12-25 14:39
快速回复:怎么在每个单词字母逆序中让标点符号的位置保持不变?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021965 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved