读书人

小弟我不明白pt[0] = 0和gets(s[0])这

发布时间: 2012-03-26 15:46:56 作者: rapoo

我不明白pt[0] = 0和gets(s[0])这两处有什么作用?什么意思?
#include <stdio.h>
#include <string.h>
void fun (char str[][10], int m, char *pt)
{
/************found************/
int k, q, i ;
for (k = 0; k < m; k++)
{q = strlen (str [k]);
for (i=0; i<q; i++)
/************found************/
pt[i] = str[k][i] ;
pt += q ;
pt[0] = 0 ;
}
}
main()
{int m, h ;
char s[10][10], p[120] ;
printf("\nPlease enter m:");
scanf("%d", &m);gets(s[0]); printf("\nPlease enter %d string:\n", m);
for (h = 0; h < m; h++) gets(s[h]);
fun(s, m, p);
printf("\nThe result is : %s\n", p);
}
程序功能是把m个字符串连接起来成新串放到pt存储区里,我不明白pt[0] = 0和gets(s[0])这两处有什么作用?什么意思?

[解决办法]
因为是二维数组, 再就是fgets取代gets.
[解决办法]
gets(s[0])的作用是清空缓冲区
[解决办法]
pt[0] = 0 ;
这个是让pt字符串的末尾是结束符,如果,还没又结束,再次循环的时候会改变这个地方的值的
[解决办法]
好吧,我承认我亲自试了一下,
先说gets(s[0]),当我们去掉gets(s[0])时,发现m=3,但是只输入了2个字符串就直接跳到fun(char,int char)了...这就是gets(s[0])的作用,因为在printf语句结束的时候你敲了一个回车,如果说没有gets();那么回车就进入循环被s[0]作为asc2的一个字符吸收了,这样,我们来看一下运行过程:
c:m=?(c:表示程序的行为;u:表示操作者的行为)
u:m=3 ; 按键enter
c: 3 strings=?
u:键入:按键enter ; ***1 ; ***2;
c:s[0]=按键enter,s[1]=***1,s[2]=***2。
明白了吧?在大一的时候我们经常在程序中加入莫名其妙的input和gets关键字来吸收Enter的效果。
其实这里楼主可以把gets(s[0])调整到printf下面,结果一样正确,再建立一个char n[3]变量,然后把gets(s[0])中的s[0]换出n[3],结果一样正确,这说明gets()在这里只是吸收了一个回车,随后s[0]里的回车被循环的第一步覆盖掉,之所以这里用s[0]是因为笔者不想再开辟变量浪费空间。
我在自己的vc上试了一下,大概就是这么回事...
[解决办法]
pt[0]=0又是怎么回事呢?
到百度查一查gets()和strlen()两个函数的定义,gets()在每个字符串末尾自动生成NUT,strlen()在计算长度时不计最后一个NUT,ascII中0表示NUT(空),如果去掉这句那么最后p[]就等于是
s[0]s[1]s[3]..s[n]\0\0\0\0\0\0...\0,后面的\0显示出来就是“烫”

有了这一句pt[0]=0则结果为
s[0]s[1]s[2]Nut\0\0\0... 返回main()算法后printf到NUT时自动停止了~

楼主可以这样,把pt[0]=0这句换到循环外,void fun()的底端,得到了正确的结果,同时不失为程序的一种优化~~
[解决办法]
gets那个是读取scanf留得'\n'的,pt[0] = 0是往字符串后面放个结尾符'\0',这个放debug里跑一下就清楚了

读书人网 >C语言

热点推荐