【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;
}

測試過程

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章