一条简单的算法题:颠倒字序

囧到没边际 2017-08-12 11:23:07
问题描述:
对给定的文本,改变输出顺序

要求:
输出的第一行是测试数据的组数n,接下来有n行,每一行为一组测试数据(不算换行符),每组数据中的标点符号及空格要保留原来的次序

样例输入:
2
Me too.
madam,I'm adam

输出:
eM oot.
madam,m'I mada

以下是我的代码(我是先试只有空格这种情况),可是每次只能输出第一个空格前面的,如果后面有空格的话就不行了,求教


#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;
#define N 100
#define M 10
char c[N];

void com1(char*c, int a, int b)
{
int l1 = b - a;
for (int i = l1-1; i >= a; --i)
{
cout<<c[i];
}
}

int main()
{

int b,a = 0;
int n,l;
cin >> n;
cin.get();

for (int i = 0; i < n; ++i)
{
cin.getline(c,100);
l=strlen(c);
for (int j = 0; j < l; ++j)
{
if (c[j] == ' ' || c[j] == ',')
{
b = j;
com1(c, a, b);
a = j;
}
}
com1(c, a, l);
cout << endl;
a = 0;
b = 0;
}

return 0;
}
...全文
377 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
TL_away 2017-09-16
  • 打赏
  • 举报
回复
引用 5 楼 qq_34844814 的回复:
[quote=引用 2 楼 tang19980327 的回复:] 可以用限定符 %[^] 里面加你不想要的字符
这个的用法可以写详细点吗?[/quote] 不好意思,我当时没看题目。这个用法是用正则运算法则,就是%[^]里面加你想要停止的字符,就可以解决字符串空格问题,用在scanf里面
  • 打赏
  • 举报
回复
#include <iostream>
void main()
{
	//输入的字符串
	char Buf[] = "123qw,456a\n789";
	std::cout << "输入的字符串:\n" << Buf << std::endl;
	int Len = strlen(Buf);
	char *begin = Buf;
	char *end = NULL;
	for (int i = 0; i <= Len; i++)
	{
		if (Buf[i] == ' ' || Buf[i] == ',' || Buf[i] == '\n' || Buf[i] == '\0')
		{
			//通过指针对每一组数据的开始和结束进行交换
			end = Buf + i - 1;
			while (1)
			{
				char tmp = *begin;
				*begin = *end;
				*end = tmp;
				//当结束指针小于或等于开始指针时就退出
				//退出时让开始指针指向下一组开始替换的数据
				if (--end <= ++begin)
				{
					begin = Buf + i + 1;
					break;
				}
			}
		}
	}
	//打印替换后的字符串
	std::cout << "\n替换后的字符串:\n" << Buf << std::endl;
		
}
biu__biu_biu 2017-08-18
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>

int main()
{
	char a[] = "madam,I'm adam.";
    char b[1024] = {0};
    int i;
    int j = 0;
    int k = 0;
    int h = 0;

    for(i = 0;i < strlen(a);i++)
    {
        k = i;
        if(a[i] == ' ' || a[i] == ',' || a[i] == '.')
        {
            for(j = h;j < i;j++)
            {
                b[j] = a[k - 1];
                k--;
            }
            h = i + 1;
            b[i] = a[i];
        }
    }
        printf("%s\n",b);
}
「已注销」 2017-08-16
  • 打赏
  • 举报
回复
if ( !isalpha(c[j]) && c[j] != ''' )
「已注销」 2017-08-16
  • 打赏
  • 举报
回复
既然所有的标点,那干嘛不用 isalpha 判断是不是字母呢,你题目说的是只有逗号空格不变,代码也是这么写的
囧到没边际 2017-08-15
  • 打赏
  • 举报
回复
引用 7 楼 jha334201553 的回复:
标点符号丢了是吧
#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;
#define N 100
#define M 10
char c[N];

void com1(char*c, int a, int b)
{
    if (a != b )
    {
        int i = b-1;
        for (; i >= a; --i)
        {
            cout<<c[i];
        }
        cout<<c[b];
    }
}

int main()
{

    int b,a = 0;
    int n,l;
    cin >> n;
    cin.get();

    for (int i = 0; i < n; ++i)
    {
        cin.getline(c,100);
        l=strlen(c);
        for (int j = 0; j < l; ++j)
        {
            if (c[j] == ' ' || c[j] == ',')
            {
                b = j;
                com1(c, a, b);
                a = j+1;
            }
        }
        com1(c, a, l);
        cout << endl;
        a = 0;
        b = 0;
    }

    return 0;
}
还差一点,不过它实际上是一个单词一个单词地颠倒,还要保持标点符号位置不变
「已注销」 2017-08-14
  • 打赏
  • 举报
回复
标点符号丢了是吧
#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;
#define N 100
#define M 10
char c[N];

void com1(char*c, int a, int b)
{
    if (a != b )
    {
        int i = b-1;
        for (; i >= a; --i)
        {
            cout<<c[i];
        }
        cout<<c[b];
    }
}

int main()
{

    int b,a = 0;
    int n,l;
    cin >> n;
    cin.get();

    for (int i = 0; i < n; ++i)
    {
        cin.getline(c,100);
        l=strlen(c);
        for (int j = 0; j < l; ++j)
        {
            if (c[j] == ' ' || c[j] == ',')
            {
                b = j;
                com1(c, a, b);
                a = j+1;
            }
        }
        com1(c, a, l);
        cout << endl;
        a = 0;
        b = 0;
    }

    return 0;
}
纹枰老妖 2017-08-13
  • 打赏
  • 举报
回复
引用 5 楼 qq_34844814 的回复:
[quote=引用 2 楼 tang19980327 的回复:] 可以用限定符 %[^] 里面加你不想要的字符
这个的用法可以写详细点吗?[/quote] 还有什么错误请详细说明一下。
kuangbao9 2017-08-12
  • 打赏
  • 举报
回复
引用 楼主 qq_34844814 的回复:
问题描述: 对给定的文本,改变输出顺序 要求: 输出的第一行是测试数据的组数n,接下来有n行,每一行为一组测试数据(不算换行符),每组数据中的标点符号及空格要保留原来的次序 样例输入: 2 Me too. madam,I'm adam 输出: eM oot. madam,m'I mada 以下是我的代码(我是先试只有空格这种情况),可是每次只能输出第一个空格前面的,如果后面有空格的话就不行了,求教

#include <iostream>
#include <cstring>
#include <fstream>

using namespace std;
#define N 100
#define M 10
char c[N];

void com1(char*c, int a, int b)
{
	int l1 = b - a;
	for (int i = l1-1; i >= a; --i)
	{
		cout<<c[i];
	}
}

int main()
{
	
    int b,a = 0;
	int n,l;
	cin >> n;
	cin.get();
	
	for (int i = 0; i < n; ++i)
	{
		cin.getline(c,100);
	    l=strlen(c);
		for (int j = 0; j < l; ++j)
		{
			if (c[j] == ' ' || c[j] == ',')
			{
				b = j;
				com1(c, a, b);
				a = j;
                                cout << c[j];
			}
		}
		com1(c, a+1, l+b+1);    //com1(c, a, l);
		cout << endl;
		a = 0;
		b = 0;
	}

	return 0;
}
你这算法局限性有点大,只能比较好的输出一行只有一个分隔符的,如果是例子的效果的话,你把红色字体部分加进去就好了,你原来的只输出第一个,主要是第二次输出下标不对。
囧到没边际 2017-08-12
  • 打赏
  • 举报
回复
引用 2 楼 tang19980327 的回复:
可以用限定符 %[^] 里面加你不想要的字符
这个的用法可以写详细点吗?
囧到没边际 2017-08-12
  • 打赏
  • 举报
回复
引用 3 楼 wenpinglaoyao 的回复:
题主您好,程序错在代码12行,把【 int l1 = b - a;】改成【 int l1 = b;】即可。
有道理,不过我觉得下面还有问题
纹枰老妖 2017-08-12
  • 打赏
  • 举报
回复
题主您好,程序错在代码12行,把【 int l1 = b - a;】改成【 int l1 = b;】即可。
TL_away 2017-08-12
  • 打赏
  • 举报
回复
可以用限定符 %[^] 里面加你不想要的字符

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧