超菜鸟问题,请好心人解答!

时间:2021-02-02 14:50:36
本人刚开始自学C语言,有一个超菜鸟的问题,想请教大家。

本人也是刚入论坛,想到以后可能用分求答案的问题很多,所以想把分省着点用。
因此这个超菜鸟的问题没有给分,但还望好心人能帮助解答一下!!!!
先谢谢大家了。

俺的问题是:
  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

#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'了。

#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是刚好就是其他字符的个数

#12


\0在字符串中是占用空间的,你怎么说它不占空间呢.

#13


是这样
如果你定义char c[]={'a','b','c'}长度是3后面没有\0
如果你定义char c[]={"abc"}长度是4后面有\0

#14


友情帮顶,俺也自学

#15


嗯,是会占用空间的,最好预留空间,不然有些时候会出现问题

#16


恩恩,楼上都答完了

#17


当然会占用数组空间了
给数组分配的是一块连续的内存空间,按字符串输出时,系统从数组首地址开始挨个输出,遇到'\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;
}
=========================================================================================

#19


还是得感谢各位的热心帮助,谢谢了!!!


不过2~4楼的朋友似乎也真的应该认真看下题目哦!?

#1


请大家帮帮忙吧!

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'了。

#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是刚好就是其他字符的个数

#12


\0在字符串中是占用空间的,你怎么说它不占空间呢.

#13


是这样
如果你定义char c[]={'a','b','c'}长度是3后面没有\0
如果你定义char c[]={"abc"}长度是4后面有\0

#14


友情帮顶,俺也自学

#15


嗯,是会占用空间的,最好预留空间,不然有些时候会出现问题

#16


恩恩,楼上都答完了

#17


当然会占用数组空间了
给数组分配的是一块连续的内存空间,按字符串输出时,系统从数组首地址开始挨个输出,遇到'\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;
}
=========================================================================================

#19


还是得感谢各位的热心帮助,谢谢了!!!


不过2~4楼的朋友似乎也真的应该认真看下题目哦!?

#20