本人也是刚入论坛,想到以后可能用分求答案的问题很多,所以想把分省着点用。
因此这个超菜鸟的问题没有给分,但还望好心人能帮助解答一下!!!!
先谢谢大家了。
俺的问题是:
C语言中字符串都是用数组存取的,而数组后都要跟“\0”字符来表示字符串的结束。
那么这里的“\0”是否占用数组元素了?
以下面这个程序的 getline 函数来理解,\0 应该是不占数组元素的。可是它又是哪里来的存取空间了?
本人实在太菜,刚开始学C语言。什么都不会,还请大家指点一下。
成分感谢!!!!
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
main()
{
int len, max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0)
printf("最长的一行是:\n%s共:%d个字符\n\n", longest, max);
system("pause");
return 0;
}
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
19 个解决方案
#1
请大家帮帮忙吧!
555555555555555555555
555555555555555555555
#2
\0是占用数组空间的。
它放在数组最的一个字符的下一位置。
它放在数组最的一个字符的下一位置。
#3
'\0' ascii码为 0 占一个字节 放在字符串最后作为结束标志
#4
会占空间,所以你得给它留个位置。
#5
是占空间的,不过你的统计方法出错了,你把字符的下标用来统计字符的个数,个数是1~n,而下标是0开始的。你的代码不是验证是否字符会包含有'\0'的问题,是你没搞清楚数组的下标表示。鄙视上面几个不看题目就回答问题的。
#6
声明存储字符串的数组时,其大小至少要比所存储的字符多1,因为编译器会自动在字符串常量的末尾添加\0.占用一个字节的空间。
#7
'\0'也是一个元素。。
你的for中那个s[i]数组的i只有1000个元素的位置。
当最后以'\0'为结尾。等于你又给s[i]加了一个‘\0’字符。
但是数组已经满了、装不下'\0'了。
你的for中那个s[i]数组的i只有1000个元素的位置。
当最后以'\0'为结尾。等于你又给s[i]加了一个‘\0’字符。
但是数组已经满了、装不下'\0'了。
#8
肯定是要占用一个空间了,比如char a[3]={1,2};那么系统会自动补一个0,这个0就是‘\0’,但绝对不是'0',或者空格。另外在局部数组和全局数组时,如果不初始化数组,两者的默认值是有巨大差别的
#9
学习了 嘿嘿
#10
占
#11
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
return i;
i就是'\0'的位置,由于数组下标由0开始,所以i是刚好就是其他字符的个数
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
return i;
i就是'\0'的位置,由于数组下标由0开始,所以i是刚好就是其他字符的个数
#12
\0在字符串中是占用空间的,你怎么说它不占空间呢.
#13
是这样
如果你定义char c[]={'a','b','c'}长度是3后面没有\0
如果你定义char c[]={"abc"}长度是4后面有\0
如果你定义char c[]={'a','b','c'}长度是3后面没有\0
如果你定义char c[]={"abc"}长度是4后面有\0
#14
友情帮顶,俺也自学
#15
嗯,是会占用空间的,最好预留空间,不然有些时候会出现问题
#16
恩恩,楼上都答完了
#17
当然会占用数组空间了
给数组分配的是一块连续的内存空间,按字符串输出时,系统从数组首地址开始挨个输出,遇到'\0' 停止.
所以对于字符串来说,字符串的末尾要加上'\0',并且'\0'肯定占内存空间,也在数组的“管辖”范围内,自然也是数组的一部分,所以也占一个元素。
否则就会不断输出下去,直到碰到任意一个'\0'。
c语言和内存联系起来学,会更好理解。
给数组分配的是一块连续的内存空间,按字符串输出时,系统从数组首地址开始挨个输出,遇到'\0' 停止.
所以对于字符串来说,字符串的末尾要加上'\0',并且'\0'肯定占内存空间,也在数组的“管辖”范围内,自然也是数组的一部分,所以也占一个元素。
否则就会不断输出下去,直到碰到任意一个'\0'。
c语言和内存联系起来学,会更好理解。
#18
发完帖子就忘记了——因为在下面自己又想明白了。
实在不好意思。
其实问题在这里,是我开始没注意到:
========================================================================================
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) /* 这里“i<lim-1”已经减1了,为的就是后面给“/0”一个存储空间啊!*/
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
=========================================================================================
实在不好意思。
其实问题在这里,是我开始没注意到:
========================================================================================
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) /* 这里“i<lim-1”已经减1了,为的就是后面给“/0”一个存储空间啊!*/
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
=========================================================================================
#19
还是得感谢各位的热心帮助,谢谢了!!!
不过2~4楼的朋友似乎也真的应该认真看下题目哦!?
不过2~4楼的朋友似乎也真的应该认真看下题目哦!?
#20
#1
请大家帮帮忙吧!
555555555555555555555
555555555555555555555
#2
\0是占用数组空间的。
它放在数组最的一个字符的下一位置。
它放在数组最的一个字符的下一位置。
#3
'\0' ascii码为 0 占一个字节 放在字符串最后作为结束标志
#4
会占空间,所以你得给它留个位置。
#5
是占空间的,不过你的统计方法出错了,你把字符的下标用来统计字符的个数,个数是1~n,而下标是0开始的。你的代码不是验证是否字符会包含有'\0'的问题,是你没搞清楚数组的下标表示。鄙视上面几个不看题目就回答问题的。
#6
声明存储字符串的数组时,其大小至少要比所存储的字符多1,因为编译器会自动在字符串常量的末尾添加\0.占用一个字节的空间。
#7
'\0'也是一个元素。。
你的for中那个s[i]数组的i只有1000个元素的位置。
当最后以'\0'为结尾。等于你又给s[i]加了一个‘\0’字符。
但是数组已经满了、装不下'\0'了。
你的for中那个s[i]数组的i只有1000个元素的位置。
当最后以'\0'为结尾。等于你又给s[i]加了一个‘\0’字符。
但是数组已经满了、装不下'\0'了。
#8
肯定是要占用一个空间了,比如char a[3]={1,2};那么系统会自动补一个0,这个0就是‘\0’,但绝对不是'0',或者空格。另外在局部数组和全局数组时,如果不初始化数组,两者的默认值是有巨大差别的
#9
学习了 嘿嘿
#10
占
#11
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
return i;
i就是'\0'的位置,由于数组下标由0开始,所以i是刚好就是其他字符的个数
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
return i;
i就是'\0'的位置,由于数组下标由0开始,所以i是刚好就是其他字符的个数
#12
\0在字符串中是占用空间的,你怎么说它不占空间呢.
#13
是这样
如果你定义char c[]={'a','b','c'}长度是3后面没有\0
如果你定义char c[]={"abc"}长度是4后面有\0
如果你定义char c[]={'a','b','c'}长度是3后面没有\0
如果你定义char c[]={"abc"}长度是4后面有\0
#14
友情帮顶,俺也自学
#15
嗯,是会占用空间的,最好预留空间,不然有些时候会出现问题
#16
恩恩,楼上都答完了
#17
当然会占用数组空间了
给数组分配的是一块连续的内存空间,按字符串输出时,系统从数组首地址开始挨个输出,遇到'\0' 停止.
所以对于字符串来说,字符串的末尾要加上'\0',并且'\0'肯定占内存空间,也在数组的“管辖”范围内,自然也是数组的一部分,所以也占一个元素。
否则就会不断输出下去,直到碰到任意一个'\0'。
c语言和内存联系起来学,会更好理解。
给数组分配的是一块连续的内存空间,按字符串输出时,系统从数组首地址开始挨个输出,遇到'\0' 停止.
所以对于字符串来说,字符串的末尾要加上'\0',并且'\0'肯定占内存空间,也在数组的“管辖”范围内,自然也是数组的一部分,所以也占一个元素。
否则就会不断输出下去,直到碰到任意一个'\0'。
c语言和内存联系起来学,会更好理解。
#18
发完帖子就忘记了——因为在下面自己又想明白了。
实在不好意思。
其实问题在这里,是我开始没注意到:
========================================================================================
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) /* 这里“i<lim-1”已经减1了,为的就是后面给“/0”一个存储空间啊!*/
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
=========================================================================================
实在不好意思。
其实问题在这里,是我开始没注意到:
========================================================================================
int getline(char s[], int lim)
{
int c, i;
for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i) /* 这里“i<lim-1”已经减1了,为的就是后面给“/0”一个存储空间啊!*/
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
=========================================================================================
#19
还是得感谢各位的热心帮助,谢谢了!!!
不过2~4楼的朋友似乎也真的应该认真看下题目哦!?
不过2~4楼的朋友似乎也真的应该认真看下题目哦!?