总结笔试1:字符串记录

   下面是一道笔试题,微软在线测试的第一题:

Description

For this question, your program is required to process an input stringcontaining only ASCII characters between ‘0’ and ‘9’, or between ‘a’ and ‘z’(including ‘0’, ‘9’, ‘a’, ‘z’).

Your program should reorder and split all input string characters intomultiple segments, and output all segments as one concatenated string. Thefollowing requirements should also be met,
1. Characters in each segment should be in strictly increasing order. Forordering, ‘9’ is larger than ‘0’, ‘a’ is larger than ‘9’, and ‘z’ is largerthan ‘a’ (basically following ASCII character order).
2. Characters in the second segment must be the same as or a subset of thefirst segment; and every following segment must be the same as or a subset ofits previous segment.

Your program should output string “<invalid input string>” when theinput contains any invalid characters (i.e., outside the '0'-'9' and 'a'-'z'range).

 

Input


Input consists of multiple cases, one case per line. Each case is one stringconsisting of ASCII characters.

Output


For each case, print exactly one line with the reordered string based on thecriteria above.

Sample Input

aabbccdd

007799aabbccddeeff113355zz

1234.89898

abcdefabcdefabcdefaaaaaaaaaaaaaabbbbbbbddddddee

Sample Output

abcdabcd

013579abcdefz013579abcdefz

<invalid input string>

abcdefabcdefabcdefabdeabdeabdabdabdabdabaaaaaaa

下面是我写的,写的很烂!有什么意见,都可以提呀!

#include <stdio.h>
#include <stdlib.h>
#define INCREACEMENT 10
#define MAXSIZE 50

typedef int Status;

Status transfer(char* S,int* str)
{
	int i;
	for (i = 0;i <strlen(S);i++)
	{
		if ('0'<=S[i]&&S[i]<='9' || 'a'<=S[i]&&S[i]<='z'  )
		{
			str[S[i]]++;
		}
		else
		{
			printf("<invalid input string>");
			return 0;
		}
	}
	return 1;
}

int main()
{
	//如何输入未知个数的字符串呢?
	char* S = (char*)malloc(MAXSIZE*sizeof(char));
	int i = 0,j,k,most_char=0;
	int str['z'+1] = {0};
	while(getchar() != 'EOF')
	{
	gets(S);
	if(transfer(S, &str))
	{
	for (i = 0;i<123;i++)
	{
		if (str[i] > most_char)
		{
			most_char = str[i];
		}
	}
	//开始输出
	for (j = 0;j <most_char;j++)
	{
		for (k = 0;k < ('z'+1);k++)
		{
		if (str[k] != 0)
		{
			printf("%c",k);
			str[k]--;
		}
		}
	}
	}
	}
	system("pause");
}

1、首先,对下面几个函数进行一下解释:

      getchar():该函数是从标准输入流中获取一个字符,相当于getc(stdin),运行getchar()时,输入的一串字符并按下回车键以后,这一串字符(包括回车字符)放入缓冲区,回车也可以被getchar()获取;getchar返回的是该字符的ASCII码!

      putchar(c)向终端输出一个数据,c是一个ASCII码,也就是说c其实是一个整数;

      gets(*s):从stdin流中读取字符串,直到接受到换行符或EOF时停止,并将读取的结果放入S中,换行符不作为读取串的内容,读取的换行符被转换为NULL值,并以此结束字符串!

     getch()功能和getchar一样,不过,getch不经过缓冲区,而是直接从键盘上输入,立刻返回一个字符,且返回值是一个字符!这个函数以后可以作为判断条件什么的,我觉得还挺有用的!

2、那么下面来说说,这题的要求就是输入行数未定的字符串,那么就采用以EOF结束的无限循环的方式,通过上面的学习,上述代码也是不对的,出现如下情况:

由于第一个字符已经被getchar取走了,所以修改了如下:

#include <stdio.h>
#include <stdlib.h>
#define INCREACEMENT 10
#define MAXSIZE 50

typedef int Status;

Status transfer(char* S,int* str)
{
	int i;
	for (i = 0;i <strlen(S);i++)
	{
		if ('0'<=S[i]&&S[i]<='9' || 'a'<=S[i]&&S[i]<='z'  )
		{
			str[S[i]]++;
		}
		else
		{
			printf("Game Over");
			return 0;
		}
	}
	return 1;
}

int main()
{
	//如何输入未知个数的字符串呢?
	char* S = (char*)malloc(MAXSIZE*sizeof(char));
	int i = 0,j,k,most_char=0;
	int str['z'+1] = {0};
	while(1)
	{
		gets(S);
		if(transfer(S, &str))
	{
	for (i = 0;i<123;i++)
	{
		if (str[i] > most_char)
		{
			most_char = str[i];
		}
	}
	//开始输出
	for (j = 0;j <most_char;j++)
	{
		for (k = 0;k < ('z'+1);k++)
		{
		if (str[k] != 0)
		{
			printf("%c",k);
			str[k]--;
		}
		}
	}
	}
		if (getchar() == EOF)
		{
			exit(0);
		}

	}
	system("pause");
}
其实上述代码还是有错:先把结果贴出来:

我们可以看见,第三个输入依然少了一个,是为什么?因为我多输入了一个回车,整个思路是这样:当我输入两个回车以后,其中第一个用于判断EOF,被getchar取走,第二个回车,运行到gets函数的地方,gets函数如果遇见了回车,就输入已经完成了,同时这个回车也是作为输入完成的一个标志,作为NULL值了,那么这个时候输入的helloworld123,运行到了getchar处了,h就被取走了,故而少了字符!

      因此,这个程序只能输入一个回车!有谁有好的方法,说一下吧!





















   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值