文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
有时候我们需要截断输出字符串,比如只输出前面某几个字符或者后面某几个字符,这就是我今天要说的。
在说方法之前我们需要了解一下puts函数:
Writes the C string pointed by str to stdout and appends a newline character ('\n').
The function begins copying from the address specified (str) until it reaches the terminating null character ('\0'). This final null-character is not copied to stdout.
下面介绍方法。
只输出前面某几个字符:
#include <stdio.h>
int main(){
int m,n,i,len;
char s[20]="www.slyar.com";
s[9]=0;
puts(s);
return 0;
}
运行后可以看到,输出了前8个字符,第9个以后的字符被截断了。关键句 s[9]=0; 本来应该是s[9]='\0',但s是字符串型,所以当把0赋给s[9]的时候,程序会把0的ascii码赋给s[9],也就是NUL(空),所以字符串被截断。
只输出后面某几个字符:
#include <stdio.h>
int main(){
int m,n,i,len;
char s[20]="www.slyar.com";
puts(s+4);
return 0;
}
运行后可以看到,输出了后10个字符,而前4个字符被截断了。关键句puts(s+4),我们知道字符数组的名字就是这个数组的内存首地址,所以s+4相当于首地址向后移动了4位,所以程序会忽略前4位字符而从第5位开始输出。
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
初级介绍,大牛请飘过。。。
在初始化数组尤其是需要每次都初始化的时候,很多同学使用循环来进行,这样不但速度慢,而且写起来也很长。所以现在提供一个函数来实现这个功能。。。
原型:extern void *memset(void *buffer, int c, int count);
功能:把buffer所指内存区域的前count个字节设置成字符c。
包含头文件:<string.h>
注意这个函数是字符串函数,所以一定要包含字符串头文件。
使用方法:
int a[50];
memset(a,0,sizeof(a));
这样呢,就将数组a内所有的值都赋成0了,sizeof也是一个函数,得到数组a的字节大小。
另外需要注意的是,memset函数是逐字节进行填充,所以a一般为char *型。对于其它类型的a,可以填充的值有两个,0和-1。因为计算机中用二进制补码表示数字,0和二进制补码为全0,-1的二进制补码为全1。
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
今天做题时候遇到的问题,先看一段代码:
#include <stdio.h>
int main(){
int n;
char a;
scanf("%d",&n);
scanf("%c",&a);
printf("%c\n",a);
return 0;
}
我们希望先读入一个整数n,然后再读入一个字符a,最后输出字符a。但是经过测试我们发现上面这段代码是无法实现我们的要求的,它只会输出一个空行,这是为什么呢?
我们一步一步分析,当我们输入数字n以后,会按一个回车确认输入。我们知道换行符也是字符(\n),所以这个换行符也同样进入了等待读入字符的a,因此我们输出的a就是一个换行符。。。
那么怎么解决呢?很简单,只要我们使用getchar()函数忽略这个换行符就可以了,最后的代码如下:
#include <stdio.h>
int main(){
int n;
char a;
scanf("%d",&n);
getchar();
scanf("%c",&a);
printf("%c\n",a);
return 0;
}
今天做题的时候不止一次遇到这个问题,特地写出来。
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
今天有人留言问我关于php爆绝对路径的事,这其实是个很古老的问题,网上也有很多解法。除了利用漏洞爆绝对路径外,我们最常见的方法就是利用php的最大执行时间来爆出绝对路径。
自己手工设置过php的人都知道,在php.ini里有一条语句"max_execution_time",这个就是php的最大执行时间。如果某个php页面在这个时间内没有执行完毕,就会报错,而php报错的话一般都会将绝对路径爆出来。php之所以有这样的设置是为了减小服务器的负担,但同时也给了黑客可乘之机。
问我的人他知道这个原理,所以他使用了DOS方式,打算使目标网站的速度减慢,从而爆出路径。但在操作的过程中发现目标网站的防DOS系统做得很好,因此他不能成功获取绝对路径,那么怎么办呢?
解决方法其实也很简单,既然我们不能减慢目标网站的速度,那我们就想办法减慢自己的速度,这样达到的效果是一样的。那么怎么减慢我们自己的速度呢?也很简单,只要我们找一个速度极慢的代理,挂上以后再上目标网站,就有可能将绝对路径爆出来。
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
忘了是谁前天问的了,本来是打算昨天写的,不过昨天有讲座写,于是乎就改今天写了。
他问我为什么 while(scanf("%d",&a)!=0) 这样的语句不能中断程序。OK,我们知道while()的参数是一个值,而这个值是scanf()函数返回的,所以我们到MSDN里面看一下相关的说明:
Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.
通过这段话,我们可以知道scanf()的返回值并不是参数的值,而是成功读入参数的个数,举例说明:
scanf("%d%d",&a, &b);
如果a和b都被成功读入,scanf()的返回值是2
如果只有a被成功读入或者只有b被成功读入,scanf()的返回值为1
如果a和b都未被成功读入,scanf()的返回值为0
如果遇到错误或遇到End Of File,scanf()的返回值为EOF。
所以呢,文章开头提到的那句代码是不能正常中断程序的。
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
在OJ做题的时候,我们经常会看到题目说:输入有多组数据。输入的第一行输入一整数N,表示有多少组数据。
这时我们就会写出如下代码来实现这句话:
int i,n;
scanf("%d",&n);
for (i=1;i<=n;i++){
}
这样写没错,但是有一种更好的方法:
int n;
scanf("%d",&n);
for (;n>0;n--){
}
或者(felix提醒)
int n;
scanf("%d",&n);
while(n--){
}
看到了么?使用这个小技巧,就可以让我们节省一个变量。所以,当我们的循环变量不参与循环体的操作时,我们就可以用这个方法来使得程序更加小巧。
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
很多朋友让我帮他们改代码,因为他们的代码总是过不了W3C标准,一次两次还好,但是对于SLYAR这种"懒仙"级别的人来说,太痛苦了。。。今天SLYAR就帮大家总结一下,以后先自查,还不行再找我。。。
1、所有元素和属性名要小写。
2、属性值必须用双引号括起。
3、属性必须有值。
4、标签"p"只能在 applet, blockquote, body, button, center, dd, del, div, fieldset, form, iframe, ins, li, map, noframes, noscript, object, td, th 中使用。
5、标签"li"只能在 dir, menu, ol, ul 中使用。
6、使用等式实体
& 转换为 &
< 转换为 <
> 转换为 >
" 转换为 "
空格 转换为
版权符© 转换为 ©
注册符® 转换为 ®
7、闭合字符要使用 />
8、图片必须加上alt=""标签
9、script必须加type="text/javascript"
先写这么多,想起来再说。。。
文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
假设你有网站A,以下代码可以使从域名访问网站A正常,而从百度、Google、雅虎搜索进入网站A的来源全部转向到http://www.slyar.com,使得后者的IP大大提升。
有兴趣的人可以自己试试。
<script>
var slyar=document.referrer
if(slyar.indexOf("baidu")>0)
self.location="http://www.slyar.com";
else if(slyar.indexOf("yahoo")>0)
self.location="http://www.slyar.com";
else if(slyar.indexOf("google")>0)
self.location="http://www.slyar.com";
</script>
最新评论