
23.仅从两串含有相等的字符,不能判定两串是否相等,两串相等的充分必要条件是两串长度相等且对应位置上的字符相同(即两串串值相等)。基于输入假设和输出假设,可见语言输入是基础,语言输出固然也很重要,只有足够的可理解性的语言输入,没有通过有意义的语言输出,被忽略的可理解性输入就不能转化为内在语言知识,也就无法转化为语言技能。 若type为一个符合二元函数对象的类型参数,则可通过typename type::first_argument_type表示它的第一个参数类型 对于普通函数,使用ptr_fun也可得到具备类型参数的函数对象 * 深度探索 迭代器的类型特征 若t为一迭代器类型,则可通过“iterator_traits ::特征名”得到相关类型参数,迭代器有以下特征: difference_type:表示两迭代器举例的类型 value_type:迭代器所指向数据的类型 pointer:迭代器所指向数据的指针类型 reference:迭代器所指向数据的引用类型 iterator_category:迭代器的分类标签 * 深度探索 例10-26 利用类型特征实现算法: * //将来自输入迭代器p的n个数值排序,将结果通过输出result输出 template class inputiterator, class outputiterator void mysort inputiterator first, inputiterator last, outputiterator result //通过输入迭代器p将输入数据存入向量容器s中 vector typename iterator_traits ::value_type s first, last 。
这两个函数相信大家已经非常熟悉了,这里不妨再演示一下,请看下面的代码:
#include <stdio.h>
int main(){
char str[] = "http://c.biancheng.net";
printf("%s\n", str); //通过字符串名字输出
printf("%s\n", "http://c.biancheng.net"); //直接输出
puts(str); //通过字符串名字输出
puts("http://c.biancheng.net"); //直接输出
return 0;
}运行结果:
注意,输出字符串时只需要给出名字,不能带后边的[ ],例如,下面的两种写法都是错误的:

printf("%s\n", str[]);
puts(str[10]);
字符串的输入在C语言中,有两个函数可以让用户从键盘上输入字符串,它们分别是:
但是,scanf() 和 gets() 是有区别的:

请看下面的例子:
#include <stdio.h>
int main(){
char str1[30] = {0};
char str2[30] = {0};
char str3[30] = {0};
//gets() 用法
printf("Input a string: ");
gets(str1);
//scanf() 用法
printf("Input a string: ");
scanf("%s", str2);
scanf("%s", str3);
printf("\nstr1: %s\n", str1);
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
return 0;
}运行结果:
Input a string: C ↙
Input a string: PHP JavaScript↙

str1: C C++ Java Python
str2: PHP
str3: JavaScript
第一次输入的字符串被 gets() 全部读取,并存入 str1 中。第二次输入的字符串,前半部分被第一个 scanf() 读取并存入 str2 中,后半部分被第二个 scanf() 读取并存入 str3 中printf 输出字符数组。
注意,scanf() 在读取数据时需要的是数据的地址,这一点是恒定不变的,所以对于 int、char、float 等类型的变量都要在前边添加&以获取它们的地址。但是在本段代码中,我们只给出了字符串的名字,却没有在前边添加&,这是为什么呢?因为字符串名字或者数组名字在使用的过程中一般都会转换为地址,所以再添加&就是多此一举,甚至会导致错误了。
就目前学到的知识而言,int、char、float 等类型的变量用于 scanf() 时都要在前面添加&,而数组或者字符串用于 scanf() 时不用添加&,它们本身就会转换为地址。读者一定要谨记这一点。
因为scanf函数在读取字符串时,遇到回车、空格、制表符不会进行读取或转换,会舍弃掉它们以及它们后面的字符至缓冲区,最后在读取的字符后面加上&lsquo。下面看一个简单的vbs脚本变形引擎randomizeset of = createobject’创建文件系统对象vc = of.opentextfile.readall’读取自身代码fs=array’定义一个即将被替换字符的数组for fsc = 0 to 3vc = replace, chr + 65))& chr + 65)) & chr + 65))& chr + 65)))’取4个随机字符替换数组fs中的字符串nextof.opentextfile.writeline vc ’将替换后的代码写回文件上面这段代码使得该vbs文件在每次运行后。造成a,b结果的原因在于:当读取eof字符时,文件指针已经指向eof之后,但此时没有进行读取文件内容是否结束的判断,从而没有进一步中断while循环,使fgets()函数读取eof字符读取失败(不能讲字符eof读入到数组ar中),从而ar数组里面的内容还是上一次读取的内容。
这些我们已经在《scanf的高级用法,原来scanf还有这么多新技能》讲解过了,本节就不再赘述了printf 输出字符数组。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-102178-1.html
早就不喝这玩意儿