Codeup:
3.6 A:
scanf:%s用来输入一个字符串并存在字符数组里,通过识别空格和换行来识别一个字符串的结束。
例子:输入:abc def(scanf("%s%s");)
代码:void con(char a[], char b[], char c[]){
int len1 = strlen(a), len2 = strlen(b);
for(int i = 0; i < len1; i++){
c[i] = a[i];
}
for(int i = 0; i < len2; i++){
c[i + len1] = b[i];
}
c[len1 + len2] = '\0';
}
(注意:如果不是使用scanf的%s或gets()函数输入字符串,则必须在字符串的末尾加上‘\0’,否则会出现乱码)。
3.6 B:
回车符‘\r’和换行符'\n'的区别:
例代码:
printf("aa");
printf("\r");
printf("bb");
printf("\n");
printf("cc");
执行结果如下:
从执行结果可以看出:回车符:将光标新移动到每行的开头,换行符:从当前行换到下一行的开头。
题目分析:
首先通过gets()函数按行进行读取,因为有多行,所以通过while(gets(c) != NULL)判断是否读取结束。
其次在处理每一行的过程中,不能通过判断字符是否是空格,就直接将其下一个变成对应的大写字母,因为'\t'是制表符,表示的空格数目不固定。
3.6 C:
C 标准库的 ctype.h 头文件提供了一些函数,可用于测试和映射字符;
常使用的库函数:int tolower(int c)(该函数把大写字母转换为小写字母);int toupper(int c)(该函数反之);
问题:关于fabs()在两个字符相减:
代码:#include <stdio.h>
#include <math.h>
int main(){
char a = 'a', b = 'A';
printf("%d\n", fabs(a-b));
return 0;
}
按结果输出应该是32,但结果确是0;
原因:fabs()返回类型为double
解题思路1:拿着大串去挨个字符对照小串的第一个字符ch[0],只要不匹配且不是空格,我就直接把这一位字符输出即可;如果发现匹配了,那么再进一层循环,大串和小串同时按位比较;(超时)
3.6 D:
参考:https://blog.csdn.net/sunshine_lyn/article/details/79552313。
解题思路:利用一个char s[101][101]二维数组存取字符串的单词,以单词分类;
3.6 E:
问题:数组只能在初始化时整体赋值,以后若想再赋值,只能一个个改变,而不能整体改变;
示例代码:
#include <stdio.h>
#include <stdbool.h>
int main(){
int a[101] = {false};
a[101] = {true};
printf("%d", a[2]);
return 0;
}
报错图如下:
解决方法:逐个赋值。
解题思路1:对大串逐个遍历,若与字符c匹配,则记录当前位置,将该位置以后的字符元素前移一位,遍历结束后,大串删除成功;
解题思路2:设置一标记数组,对大串逐个遍历,若与字符c匹配,则相应标记数组置为true,重新遍历大串,若当前位置标记数组为false,则输出字符。
3.6 F:
解题思路:遍历一半,头尾交换。
(注意:输入可能有空格,故输入只能采用gets(),而不能scanf()。)
3.6 G:
解题思路:利用strlen()函数,比较串长。
3.6 H:
解题思路:利用index记录当前输入多少个字符串。
3.6 I:
解题思路:与3.6F解题思路类似,增加一strcmp()函数判断。