【C语言】测试输入模板

在测试代码时,一般需要执行输入数据步骤,此步骤的模板函数:


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

#define BUF_SIZE  1024

int getString(char * pstr)
{
	int   i = 0;
	
	while(1)
	{
		scanf("%c", &pstr[i]);
		if(pstr[i] == '\n' || i >= BUF_SIZE -1)
		{
			break;
		}
		i++;
	}
	pstr[i] = '\0';

	return i;
}

int main(int argc, char **argv)
{
	char	s[BUF_SIZE] = {'\0'};
	int		n ;
		
	n = getString(s);
	
	printf("String : %s \n", s);

	return 0;
}

演示实例:

1 Windows下

2 Linux下

vim text.txt

text.txt :i like  eating

实例1

输入: i like eating

输出:eating like i


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

#define BUF_SIZE  1024

void stringReverse(char * pstr, int slen)
{
	int		i = 0; 
	char *	p;
	char *	ptmp;
	int		wordlen = 0;

	ptmp = (char *) malloc(slen * sizeof(char)); //牺牲存储空间换时间复杂度
	memset(ptmp, 0, slen*sizeof(char));
	p = ptmp;

	for(i = slen - 1; i >= 0 ; i -- )
	{
		if( pstr[i] == ' ' )
		{
			//memcpy(p, &pstr[i+1], wordlen);
			strncpy(p, &pstr[i+1], wordlen);
			p[wordlen] = ' ';
			p = p+wordlen+1; 
			wordlen = 0;
		} else if ( i == 0 )
		{
			//memcpy(p, &pstr[i], wordlen+1);
			strncpy(p, &pstr[i], wordlen+1);
			p[wordlen+1] = '\0';
		}
		else
		{
			wordlen ++;
		}
	}
	//memcpy(pstr, ptmp, slen);
	strncpy(pstr, ptmp, slen);
	//printf("ptmp:%s \n", ptmp);
	//printf("pstr:%s \n", pstr);
	//printf("strlen(ptmp) : %d \n", strlen(ptmp));
}

int getString(char * pstr)
{
	int   i = 0;
	
	while(1)
	{
		scanf("%c", &pstr[i]);
		if(pstr[i] == '\n' || i >= BUF_SIZE -1)
		{
			break;
		}
		i++;
	}
	pstr[i] = '\0';

	return i;
}

int main(int argc, char **argv)
{
	char	s[BUF_SIZE] = {'\0'};
	int		n ;
		
	n = getString(s);
	printf("String : %s \n", s);
	//printf("n: %d \n", n);
	//printf("strlen(s): %d  \n", strlen(s));
	stringReverse(s, n);
	printf("String : %s \n", s);

	return 0;
}

实例2 

滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。
返回滑动窗口最大值。
示例:
输入: nums = [2,5,-2,-1,3,7,9,1], 和 k = 3
输出: [5,5,3,7,9,9] 
解释: 

滑动窗口的位置                最大值
---------------               -----
[2  5  2] 1  3  7  9  1       5
 2 [5  2  1] 3  7  9  1       5
 2  5 [2  1  3] 7  9  1       3
 2  5  2 [1  3  7] 9  1       7
 2  5  2  1 [3  7  9] 1       9
 2  5  2  1  3 [7  9  1]      9

1 <= k <= 数组长度,数组不为空

输入描述
第一行为使用空格隔开的数组

第二行为k的值

例如:

2 5 2 1 3 7 9 1

3
输出描述
一行使用空格隔开的数字

5 5 3 7 9 9
示例1
输入
2 5 2 1 3 7 9 1
3
输出
5 5 3 7 9 9

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

#define BUF_SIZE 1024
#define NUMBITSMAX 7

int getMaxNum(int *pNum, int k)
{
    int  i =0;
    char num = pNum[0];
    
    for(i=0; i < k; i++ )
    {
        if(num < pNum[i])
        {
            num = pNum[i];
        }
    }
    
    return num;
}

int *  getWinNum(int * pNum, int n, int k)
{
    int		i = 0;
    int *	p = pNum;
    int *	pRet ;

    pRet = (int  *) malloc( (n-k)* sizeof(int));
    for(i = 0 ; i < (n  - k + 1) ; i ++ )
    {
        pRet[i] = getMaxNum(&p[i], k);    
    }
    
    return pRet;
}


/*
* 关键的函数,此处与实例一与模板不同 此处返回值为输入的字符串中以空格隔开的单词个数..
* 这是一种进步
*/
int getString(char * pstr)
{
	int     i = 0;
	int		numOfWord = 0;
	while(1)
	{
		scanf("%c", &pstr[i]);
		if(pstr[i] == '\n' || i >= BUF_SIZE -1)
		{
			numOfWord ++;
			break;
		}
		if (pstr[i] == ' ')
		{
			numOfWord ++;	
		}
		i++;
	}
	pstr[i] = '\0';

	return numOfWord ;
}
/*
* 处理输入的字符串
* numOfWord 为空格隔开的数目 
*/
int * handleInput(char *pstr, int  numOfWord)
{
	int		i = 0;
	char *	p = pstr;
	int	 *  pRet ;
	int		k = 0;
	int		slen = strlen(pstr);
	char	tmp[NUMBITSMAX] = {'\0'};
	int		lenOfWord = 0;
	pRet = (int *)malloc(numOfWord * sizeof(int));
	
	for(i = 0; i < slen; i ++)
	{
		if(pstr[i] == ' ')
		{
			memset(tmp, 0, NUMBITSMAX);
			strncpy(tmp, p, lenOfWord);
			pRet[k++] = atoi(tmp);
			p = p + lenOfWord + 1;
			lenOfWord=0;
		} else if( i == slen - 1)
		{
			memset(tmp, 0, NUMBITSMAX);
			strncpy(tmp, p, lenOfWord + 1);
			pRet[k++] = atoi(tmp);
		}
		else
		{
			lenOfWord++;
		}
	}

	return pRet;
}

int main(int argc, char ** argv){
    char  s[BUF_SIZE] = "25213791";
    int   n = 0;
    int   k = 3;
    int   i = 0;
	int	* pInput;
    int * pRet;
    
    n = getString(s);
    scanf("%d", &k);

    /*处理输入的字符串,转化为数组*/
    pInput = handleInput(s, n);

	printf("pInput: \n");
	for( i= 0; i < n; i ++)
    {
        printf("%d ", pInput[i]);
    }
    printf("\n");
    pRet = getWinNum(pInput, n, k);

	printf("n : %d \n", n);
	printf("k : %d \n", k);

	printf("pRet:  \n");
    for( i= 0; i < (n - k + 1); i ++)
    {
        printf("%d ", pRet[i]);
    }
    printf("\n");
    
    return 0;
}

测试过程

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值