在测试代码时,一般需要执行输入数据步骤,此步骤的模板函数:
#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;
}
测试过程