1.设计并测试一个函数,从输入中获取下n个字符(包括空白符、制表符、换行符),把结果储存在一个数组里,它的地址被传递作为一个参数。
#include
void getInput(char * arr, int size);
int main(void)
{
char arr[10];
getInput(arr, 10);
puts(arr);
return 0;
}
void getInput(char * arr, int size)
{
char ch;
int count = 0;
while (((ch = getchar()) != '\n') && count < size)
{
*arr++ = ch;
count++;
}
return;
}
2.修改变成练习1的函数,在n个字符后停止,或在读到第1个空白符、制表符、或换行符时停止,哪个先遇到哪个停止。不能只使用scanf()。
#include
#include
void getInput(char * arr, int size);
int main(void)
{
char arr[10];
getInput(arr, 10);
puts(arr);
return 0;
}
void getInput(char * arr, int size)
{
char ch;
int count = 0;
while ((!isblank(ch = getchar())) && count < size)
{
*arr++ = ch;
count++;
}
return;
}
3.设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中的其余字符。该函数应该跳过第1个非空白字符前面的所有空白。将一个
单词定义为没有空白、制表符或换行符的字符序列。
#include
#include
void getWord(char * arr);
int main(void)
{
char arr[10];
getWord(arr);
puts(arr);
return 0;
}
void getWord(char * arr)
{
char ch;
while (!isblank(ch=getchar()))
*arr++ = ch;
// 清空缓冲
while (getchar() != '\n')
continue;
return;
}
4.设计并测试一个函数,它类似编程练习3的描述。只不过它接受第2个参数指明可读取的最大字符数。
#include
#include
void getWord(char * arr, int size);
int main(void)
{
char arr[10];
getWord(arr, 3);
puts(arr);
return 0;
}
void getWord(char * arr, int size)
{
char ch;
int count = 0;
while ((!isblank(ch=getchar())) && count < size)
{
*arr++ = ch;
count++;
printf("count : %d \n", count);
}
// 清空缓冲
while (getchar() != '\n')
continue;
return;
}
5.设计并测试一个函数,搜索第1个函数形参指定的字符串,在其中查找第二个函数指定的字符首次出现的位置。如果成功,该函数返回指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功能与strchr()函数相同)。在一个完整的程序中测试函数,使用一个循环给函数提供输入值。
#include
#include
char * my_strchar(char * str, char * val);
int main(void)
{
char * str1 = "abcdef";
char * str2 = "bcd";
my_strchar(str1, str2);
char * get_p = my_strchar(str1, str2);
puts(get_p);
return 0;
}
char * my_strchar(char * str, char * val)
{
char * p_str = str;
char * p_val = val;
char * ret;
int isEqual = 0; // 不相等为0 相等为1
while ((*p_str != '\0') && (*p_val != '\0'))
{
if (*p_str == *p_val)
{
isEqual = 1;
if (isEqual == 1)
{
p_val++;
p_str++;
}
}
else
str
}
if (isEqual == 0)
ret = NULL;
return ret;
}
6.编写一个名为is_within()函数,接受一个字符和一个指向字符串的指针作为两个函数形参。如果指定字符在字符串中,该函数返回一个非零值(即为真)。否则,返回0(即为假)。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
#include
#include
int is_within(char ch, char *str);
int main(void)
{
char * str = "abcdef";
char ch;
int state = 0;
while (scanf("%c", &ch)== 1 )
{
while (getchar() != '\n')
continue;
state = is_within(ch, str);
printf("%d", state);
printf("¥¥¥¥¥¥¥¥ \n");
}
return 0;
}
int is_within(char ch, char *str)
{
bool is_in = false;
while (*str) // 括号内不能写成(*str++)因为副作用会完成
{
if (ch == *str)
is_in = true;
str++;
}
return is_in;
}
7.strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有必要的话在末尾添加空字符。如果s2的长度是n或者多余n,目标字符串不能以空字符结尾。该函数返回s1。自己编写这样一个函数,名为mystrncpy()。在一个完整的程序中测试该函数,使用一个循环给函数提供输入值。
void mystrncpy(char *target, char *source, int num)
{
for (int i = 0; i < num; i++)
target[i] = source[i];
return 0;
}
8.编写一个名为string_in()的函数,接受两个指向字符串的指针作为参数。如果第二个字符串中包含第一个字符串,该函数将返回第一个字符串的开始的地址。例如,string_in(“hats”,“act)将返回hats中a的地址。否则,该函数返回空指针。在一个完整的程序中测试该函数。使用一个循环给函数提供输入值。
9.编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整程序中测试该函数,使用一个循环给函数提供输入值。
#include
#include
#include
char * Reverse(char *str);
int main(void)
{
char * str = "abcdefg";
char * rel = Reverse(str);
puts(rel);
return 0;
}
char *Reverse(char *str)
{
int n = strlen(str);
char *temp = (char*)malloc(sizeof(char) * (n + 1));
for (int i = 1; *str; i++)
{
temp[n-i] = *str++;
}
return temp;
}
10.编写一个函数接受一个字符串作为参数,并删除字符串中的空格。在一个程序中测试该函数,使用循环读取输入行,直到用户输入一行空行。该程序应该用函数只每个输入的字符串,并显示处理后的字符串。
char *delete_space(char *str)
{
char temp[SIZE];
int i = 0;
int j = 0;
for (i; i < SIZE; i++)
{
if (str[i] != SPACE)
{
temp[j++] = str[i];
}
}
return temp;
}
11.编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中的第一个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能真正完成菜单各中选项的功能。
12.编写一个程序,读取输入,直到读到EOF,报告读入的单词数、大写字母数,小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的函数。
13.编写一个程序,反序显示命令行参数的单词。例如,命令行参数是see you later,该程序应该打印later see you。
14.编写一个通过命令行运行的程序计算幂。第1个命令行参数是double类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。
15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,该函数返回0。
16.编写一个程序读取输入,直到读取文件结尾,然后把字符串打印出来。该程序识别和实现下面的命令行参数:
-p 按原样打印
-u 把输入全部转换成大写
-l 把输入全部转换成小写
如果没有命令行参数,则让程序像是使用了-p参数那样运行。