使用memset函数初始化数组

2008年11月18日 22:48 . 分类 编程相关 . 2 条评论 . 被踩 524 次 

文章作者: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。

C语言 读入字符时需要注意的一个问题

2008年11月16日 23:21 . 分类 编程相关 . 3 条评论 . 被踩 524 次 

文章作者: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;
}

今天做题的时候不止一次遇到这个问题,特地写出来。

二道数学题阐释递归思想

2008年11月12日 23:55 . 分类 编程相关 . 2 条评论 . 被踩 190 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

有同学问什么是递归,我懒得说,拿两道数学题来阐释好了。。。

1、两个人从1开始,轮流报数,每个人都只能报接下来的一个数或两个数。比如第一个人可以报1,也可以报1、2;如果第一个人报1、2,第二个人就可以报3或者3、4;然后第一个人又报......这样报下去,最先报到30的人获胜,求必胜策略。

解答:最先报到30的人获胜,那么先报到27的人就一定可以获胜,同理先报到24的人就一定能获胜……递归下去。21,18,15……,最终得到的结论就是先报到3的人必胜。也就是说,后报者必胜。不管先报者报多少,后报者始终能报到3的倍数,必胜。

如果先报到30的人输,同理,先报到29的人就赢了,然后同样递归,26,23,20……

2、有10枚硬币,每人轮流取硬币,可以拿一枚、两枚或四枚,取到最后一枚硬币者胜。求必胜策略。

利用递归思想解答:

硬币总数是一枚,先取者赢;
硬币总数是两枚,先取者赢;
硬币总数是三枚,先取者输;
硬币总数是四枚,先取者赢;
硬币总数是五枚,先取者赢(自己取两枚,对方面临三枚的情形,必输);
硬币总数是六枚,先取者输(不管取多少,对方面临的情形都是必胜的);
硬币总数是七枚,先取者赢(自己取一枚,对方面临六枚的情形,必输);
硬币总数是八枚,先取者赢(自己取两枚,对方面临六枚的情形,必输);
硬币总数是九枚,先取者赢(不管取多少,对方面临的情形都是必胜的);
硬币总数是十枚,先取者赢(自己取一枚,对方面临九枚的情形,必输)。

C语言中 scanf()的返回值是成功读入参数的个数

2008年11月08日 23:01 . 分类 编程相关 . 2 条评论 . 被踩 511 次 

文章作者: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。

所以呢,文章开头提到的那句代码是不能正常中断程序的。

C语言 多组数据for循环的一个小技巧

2008年11月05日 22:38 . 分类 编程相关 . 9 条评论 . 被踩 701 次 

文章作者: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--){
}

看到了么?使用这个小技巧,就可以让我们节省一个变量。所以,当我们的循环变量不参与循环体的操作时,我们就可以用这个方法来使得程序更加小巧。

正负数十进制转二进制 位运算 C语言版

2008年11月01日 18:03 . 分类 编程相关 . 2 条评论 . 被踩 685 次 

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

今天在论坛上看到一个负十进制数转二进制的问题,于是小研究了一下,顺便学习位运算。。。

我们知道负数的二进制是由其正数的二进制取反(求反码)再加一(求补码)得到的,例如:

十进制数528的二进制码为:0000001000010000

将其取反(求反码)后的结果:1111110111101111

将反码加一(求补码)后结果:1111110111110000

所以,-528的二进制码为1111110111110000

小说一下概念,然后看一个位运算符,按位与(&) :0&0=0 , 0&1=0 , 1&0=0 , 1&1=1

我们知道,奇数的二进制最后一位全部为1而偶数的二进制最后一位全部为0,那么用按位与运算符我们可以很方便地知道一个数是奇数还是偶数,只要让数字 &1 就可以了,因为 奇数&1=1 ,而 偶数&1=0

现在看一段代码,作用是将十进制数转换为二进制数。

#include <stdio.h>

int main()
{
int x,i;
scanf("%d",&x);
for(i=31;i>=0;i--) printf("%d",x>>i&1);
system("pause");
}

重点就在 x>>i&1 啦,每次按照能否被二整除来确定0或者1,然后一位一位的移动,这样处理负数也是可以的,很爽~详细解释太麻烦,自己思考吧,嘎嘎~

关闭
E-mail It