1、设计并测试一个函数,从输入中获取n个字符(包括空白、制表符、换行符),把结果存储在一个函数里,它的地址被传递作为一个参数。
答案:传递的参数是:地址,字符长度
#include <stdio.h>
#include<string.h>
#define LEN 10
char *s_gets(char *st, int n);
int main(void)
{
char str[LEN];
char * val;
puts("Enter string:");
val = s_gets(str, LEN - 1);
puts("Output string:");
if (val)
{
puts(str);
printf("Successful!\n");
}
else
printf("Faile!\n");
return 0;
}
char *s_gets(char *st, int n)
{
int ret_val;
int i = 0;
//char ch;
//停止读入的条件:1、达到长度限制2、第一个换行符
//ret_val = fgets(st, n,stdin);
/*getchar 等函数的返回值类型都是 int 型,
当这些函数读取出错或者读完文件后,会返回 EOF.*/
for (i = 0; i < n; i++)
{
ret_val = getchar();
if (ret_val)
st[i] = ret_val;
else//ret_val==NULL
break;
}
if (ret_val)
//return st[i];
{
st[i] = '\0';
return st;
}
else
return NULL;
}
自己编写:传递参数为:地址
方法一:
#include<stdio.h>
#define LEN 100
char *getnchar(char* str);
int main(void)
{
char str[LEN];
puts("Enter characters:");
getnchar(str);
printf("%s\n", str);
return 0;
}
char *getnchar(char* str)
{
int index = 0;
while ((str[index] = getchar()) != EOF)
{
index++;
}
if (str[index] == EOF)
str[index] = '\0';
return str;
}
方法二:
#include<stdio.h>
#define SIZE 10
char * getstr(char *str, int n);
int main(void)
{
char array[SIZE];
char *val;
printf("Enter string:\n");
val = getstr(array, SIZE - 1);
printf("Output string\n");
if (val)
puts(array);
else
puts("Failed!");
printf("Well done!\n");
return 0;
}
char * getstr(char *str, int n)
{
int num = 0;;
char ch;
while (ch = getchar())
{
if (ch != EOF&&num < n)
{
str[num] = ch;
num++;
}
else
break;
}
str[num] = '\0';
if (num == 0)
return NULL;
else
return str;
/*if (ch == EOF)
return NULL;
else
{
str[num] = '\0';
return str;
}*/
}
2、修改编程练习1的函数,在n个字符后停止,或在读到第一个空白、制表符或换行符时停止,哪个选遇到哪个停止。不能只使用scanf()。
#include <stdio.h>
#include<string.h>
#include<ctype.h>
#define LEN 10
char *s_gets(char *st, int n);
int main(void)
{
char str[LEN];
char * val;
puts("Enter string:");
val = s_gets(str, LEN - 1);
puts("Output string:");
if (val)
{
puts(str);
printf("Successful!\n");
}
else
printf("Faile!\n");
return 0;
}
char *s_gets(char *st, int n)
{
int ret_val;
int i = 0;
for (i = 0; i < n; i++)
{
ret_val = getchar();
if (!isspace(ret_val))
st[i] = ret_val;
else//ret_val==NULL
break;
}
if (ret_val)
{
st[i] = '\0';
return st;
}
else
return NULL;
}
【注】与想要的效果的不一样
#include <stdio.h>
#include<string.h>
#include<ctype.h>
#define LEN 10
char *s_gets(char *st, int n);
int main(void)
{
char str[LEN];
char * val;
puts("Enter string:");
val = s_gets(str, LEN - 1);
puts("Output string:");
if (val)
{
puts(str);
printf("Successful!\n");
}
else
printf("Faile!\n");
return 0;
}
char *s_gets(char *st, int n)
{
int ret_val;
int i = 0;
for (i = 0; i < n; i++)
{
ret_val = getchar();
if (!isspace(ret_val))
st[i] = ret_val;
else//ret_val==NULL
st[i] = '\0';
}
return st;
}
【注】还是不够好………………
3、设计并测试一个函数,从一行输入中把一个单词读入一个数组中,并丢弃输入行中其他的字符。该函数应该跳过第一个非空白字符前面的所有空白。将一个单词定义为没有空白、制表符或换行符的字符序列。
11.3
#include<stdio.h>
#include<ctype.h>
#define LEN 100
char *getschar(char *string);
int main(void)
{
char arr[LEN];
char *point;
if(point)
puts(string);
else
puts("Fail!");
return 0;
}
char *getschar(char *string)
{
char *re_val;
char ch;
re_val=string;
while((ch=getchar())!=EOF&&isspace(ch))//跳过第一个字母前的空格
continue;
if(ch==EOF)
return ret_val=NULL;
while(ch!=EOF&&!isspace(ch))
{
*string=ch;//获得第一个字母
string++;
ch=getchar();
}
*string='\0';
if(ch==EOF)
return ret_val;
else
{
while(getchar()!=EOF)
continue;
return ret_val;
}
}
4、设计并测试一个函数,它类似编程练习3的描述,只不过它接受第2个参数指明可读取的最大字符数。
**//最大的字符数为9**
#include<stdio.h>
#include<ctype.h>
#define LEN 10
char *getschar(char *str, int n);
int main(void)
{
char str[LEN];
char *val;
puts("Please a string:");
val = getschar(str, LEN-1);
if (val)
puts(str);
else
puts("Fail!");
puts("Well done!");
return 0;
}
char *getschar(char *str, int n)
{
int index=0;
char *ret_val;
char ch;
ret_val = str;
while ((ch = getchar()) != EOF&&isspace(ch))
continue;
if (ch == EOF)
return ret_val = NULL;
else
{
str[index] = ch;
index++;
}
while ((ch = getchar()) != EOF && !isspace(ch) && index < n)
{
str[index] = ch;
index++;
}
str[index] = '\0';
if (ch == EOF)
return ret_val;
else
while (getchar() !=EOF )
continue;
return ret_val;
}
5、测试删除多余字符未成功
设计并测试一个函数,搜索第1个函数形参指定的字符串,在其中查找第
2个函数形参指定的字符首次出现的位置。如果成功,该函数返指向该字
符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的
功能与 strchr()函数相同)。在一个完整的程序中测试该函数,使用一个
循环给函数提供输入值。
#include<stdio.h>
#define LEN 100
char *getstr(char *str, int n);//输入字符串
char *find(char* str, char ch);//遍历字符串,查找字符
int main(void)
{
char str[LEN];
char ch;
char *val;
puts("Please enter a string:");
getstr(str, LEN);
puts("Please enter the character you want to find");
while ((scanf_s("%c", &ch, 1)) != 1)
puts("Please re-enter the characters");
getchar();
val = find(str, ch);
if (val)
printf("The address of character %c is %p\n", ch, val);
else
printf("Fail!\n");
printf("Done!\n");
return 0;
}
//输入字符串
char *getstr(char *str, int n)
{
char ch;
int index = 0;
//跳过开始输入的无效的字符
while ((ch = getchar()) == EOF)
continue;
str[index] = ch;//获得第一个有效字符
index++;
//获取其他字符
while ((ch = getchar()) != EOF&&index<n)
{
str[index] = ch;
index++;
}
str[index] = '\0';
//输出字符串的地址,判断find()的返回值是否正确
printf("The address of the string is %p\n", str);
return str;
}
//遍历字符串,查找字符
char* find(char* str, char ch)
{
char *ret;
ret = str;
while (*++str != '\0')
{
if (*str != ch)
continue;
else
return ret = str;
}
//if (*str == '\0')
return ret = NULL;
}
6.编写一个名为is_within()的函数,接受一个字符和一个指向字符串的指
针作为两个函数形参。如果指定字符在字符串中,该函数返回一个非零
值(即为真)。否则,返回0(即为假)。在一个完整的程序中测试该函
数,使用一个循环给函数提供输入值。
#include<stdio.h>
#include<string.h>
#define LEN 100
int is_within(char *string, char ch);
char* s_getchar(char *string, int n);
int main(void)
{
int index;
char string[LEN];
char ch;
printf("Please enter a string:\n");
while (s_getchar(string,LEN))
{
printf("Please enter the characters:\n");
while (!scanf_s("%c", &ch,1))
printf("Please re-enter the characters:\n");
getchar();
index = is_within(string, ch);
if (index)
printf("%c is in the target string\n", ch);
else
printf("The specified character was not found.\n");
printf("Please continue to enter a set of strings:\n");
}
printf("Well done!\n");
return 0;
}
char* s_getchar(char *string, int n)
{
char *ret_val;
int index=0;
ret_val = fgets(string, n, stdin);
if(ret_val)
{
while (string[index] != '\n'&&string[index] != '\0')
index++;
if (string[index] == '\n')
string[index] = '\0';
else
while (getchar() != '\n')
continue;
}
return ret_val;
}
int is_within(char *string, char ch)
{
int judge = 0;
char *ret_val;
ret_val = strchr(string, ch);
if (ret_val)
return judge = 1;
else
return judge = 0;
}
7.strncpy(s1, s2, n)函数把s2中的n个字符拷贝至s1中,截断s2,或者有
必要的话在末尾添加空字符。如果s2的长度是n或多于n,目标字符串不
能以空字符结尾。该函数返回s1。自己编写一个这样的函数,
名为mystrncpy()。在一个完整的程序中测试该函数,使用一个循环给函
数提供输入值。
#include<stdio.h>
#include<string.h>
#define LEN 10
//#define WID 100
char *s_gets(char *temp, int n);
char *mystrncpy(char *string, char *temp, int n);
int main(void)
{
char string[LEN];
char temp[LEN];
int index = 0;
char *ps;
printf("Please enter a string:\n");
while (s_gets(temp, LEN))
{
ps=mystrncpy(string, temp, LEN-1);
puts(ps);
printf("Please enter a string:\n");
}
printf("Well done!\n");
return 0;
}
char *s_gets(char *temp, int n)
{
char *ret_val;
int index = 0;
ret_val = fgets(temp, n, stdin);
if (ret_val)
{
while (temp[index] != '\0'&&temp[index] != '\n')
index++;
if (temp[index] == '\n')
temp[index] = '\0';
else
{
while (getchar() != '\n')
continue;
}
}
return ret_val;
}
char *mystrncpy(char *string, char *temp, int n)
{
char *ret;
int index = 0;
ret = string;
while (index <= n&&*temp != '\0')
{
*string = *temp;
string++;
temp++;
index++;
}
*string = '\0';
return ret;
}
8.编写一个名为string_in()的函数,接受两个指向字符串的指针作为参
数。如果第2个字符串中包含第1个字符串,该函数将返回第1个字符串
开始的地址。例如,string_in(“hats”, “at”)将返回hats中a的地址。否则,
该函数返回空指针。在一个完整的程序中测试该函数,使用一个循环给
函数提供输入值。
#include<stdio.h>
#include<string.h>
#define LEN 100
char *s_gets(char *temp, int n);
char *string_in(char *target, char *source);
int main(void)
{
char source[LEN];
char target[LEN];
char *address;
printf("Please enter the target string:\n");
while (s_gets(target, LEN))
{
printf("Please enter the source string:\n");
s_gets(source, LEN);
address = string_in(target, source);
if (address)
printf("Address is %p\n", address);
else
printf("Fail!\n");
printf("Please enter the target string:\n");
}
printf("Well done!\n");
return 0;
}
char *s_gets(char *temp, int n)
{
char *ret_val;
int index = 0;
ret_val = fgets(temp, n, stdin);
if (ret_val)
{
while (temp[index] != '\0'&&temp[index] != '\n')
index++;
if (temp[index] == '\n')
temp[index] = '\0';
else
{
while (getchar() != '\n')
continue;
}
}
return ret_val;
}
char *string_in(char *target, char *source)
{
char *ret_val;
ret_val = target;
if (strlen(target) < strlen(source))
return NULL;
while (*target != *source&&*target != '\0')
{
target++;
continue;
}
if (*target == '\0')
return ret_val = NULL;
else
{
ret_val = target;
target++;
source++;
}
while (*target == *source&&*target != '\0')
{
target++;
source++;
}
if (*source == '\0')
return ret_val;
else
return NULL;
}
9.编写一个函数,把字符串中的内容用其反序字符串代替。在一个完整
的程序中测试该函数,使用一个循环给函数提供输入值。
#include<stdio.h>
#include<string.h>
#define LEN 40
char *s_gets(char *temp, int n);
int main(void)
{
char string[LEN];
int len;
int index;
printf("Please enter a string:\n");
while (s_gets(string, LEN))
{
len = strlen(string);
//index = len-1,数组下表是从0开始,下表比数量小1
for (index = len-1; index >= 0; index--)
printf("%c", string[index]);
printf("\n");
printf("Please enter a string:\n");
}
printf("Well done!\n");
return 0;
}
char *s_gets(char *temp, int n)
{
char *ret_val;
int index = 0;
ret_val = fgets(temp, n, stdin);
if (ret_val)
{
while (temp[index] != '\0'&&temp[index] != '\n')
index++;
if (temp[index] == '\n')
temp[index] = '\0';
else
{
while (getchar() != '\n')
continue;
}
}
return ret_val;
}
10.编写一个函数接受一个字符串作为参数,并删除字符串中的空格。
在一个程序中测试该函数,使用循环读取输入行,直到用户输入一行空行。
该程序应该应用该函数只每个输入的字符串,并显示处理后的字符串。
在这里插入代码片
11.编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用
户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字
符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符
串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能
真正完成菜单中各选项的功能。
在这里插入代码片
12.编写一个程序,读取输入,直至读到 EOF,报告读入的单词数、大
写字母数、小写字母数、标点符号数和数字字符数。使用ctype.h头文件中的
函数。
在这里插入代码片
13.编写一个程序,反序显示命令行参数的单词。例如,命令行参数是
see you later,该程序应打印later you see。
在这里插入代码片
14.编写一个通过命令行运行的程序计算幂。第1个命令行参数是double
类型的数,作为幂的底数,第2个参数是整数,作为幂的指数。
在这里插入代码片
15.使用字符分类函数实现atoi()函数。如果输入的字符串不是纯数字,
该函数返回0。
在这里插入代码片
16.编写一个程序读取输入,直至读到文件结尾,然后把字符串打印出
来。该程序识别和实现下面的命令行参数:
-p 按原样打印
-u 把输入全部转换成大写
-l 把输入全部转换成小写
如果没有命令行参数,则让程序像是使用了-p参数那样运行。
在这里插入代码片