鱼C论坛

 找回密码
 立即注册
查看: 1950|回复: 6

[已解决]学习『带你学C带你飞』第26集,字符串统计的长度,为啥不能作为数组的变量长度?

[复制链接]
发表于 2018-1-25 00:05:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
伟大的鱼油们,学习『带你学C带你飞』第26集,字符串统计的长度,为啥不能作为数组的变量长度?

能不能帮忙解惑,我这样写,怎么会给我报"Segmentation fault"
#include <stdio.h>

#define MAX 1024

int main(){
        char *str;
        printf("请输入一个句子: ");
        fgets(str, MAX, stdin);

        int len;
        while ( *str != '\0' ) {
                str++;
                len++;
        }


        char arr[len];
        for ( int i=0; i<len; i++ ) {
                arr[i] = i;
        }

        printf("%d\n", arr[5]);

        return 0;
}

输出
localhost:e26 Yuki$ gcc home2.c 
localhost:e26 Yuki$ ./a.out 
请输入一个句子: I love
Segmentation fault: 11


但是这样写又是好的,为啥呢?
#include <stdio.h>

int main(){
        int n;
        printf("请输入一个数字: ");
        scanf("%d", &n);

        char arr[n];
        for ( int i=0; i<n; i++ ) {
                arr[i] = i;
        }

        printf("%d\n", arr[5]);

        return 0;
}

输出
localhost:e26 Yuki$ gcc home2.c 
localhost:e26 Yuki$ ./a.out 
请输入一个数字: 10
5
最佳答案
2018-1-25 10:49:27
不让你用malloc造内存~ 你就再造个数组呗~
#include <stdio.h>

#define MAX 1024

int main(){
        
                char p_arr[MAX] = {0};
                char *str = p_arr;
        
        printf("请输入一个句子: ");
        fgets(str, MAX, stdin);

        int len = 0;
        while ( *str++ != '\0' ) {
                len++;
        }

        char arr[len];
        for ( int i=0; i<len; i++ ) {
                arr[i] = i;
        }

        printf("%d\n", arr[len-1]);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-25 00:12:04 | 显示全部楼层

#include <stdio.h>
#include <stdlib.h>

#define MAX 1024

int main() {
        //char *str;
        char *str = malloc(MAX);
        printf("请输入一个句子: ");
        fgets(str, MAX, stdin);

        int len;
        while(*str != '\0') {
                str++;
                len++;
        }


        char arr[len];
        for(int i = 0; i<len; i++) {
                arr[i] = i;
        }

        printf("%d\n", arr[5]);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-25 07:55:48 From FishC Mobile | 显示全部楼层
你的len没有初始化对它进行++得到的值是不确定的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-25 09:00:04 | 显示全部楼层
#include <stdio.h>

#define MAX 1024

int main()
{
    char *str;    //错误1:指针没有赋初值,是野指针。
    printf("请输入一个句子: ");
    fgets(str, MAX, stdin);

    int len;  //错误2:应改为 int len = 0;
    while ( *str != '\0' ) {
        str++;
        len++;
    }


    char arr[len];   //  仅仅是统计字符串长度的话,这个语句块是多余的。
    for ( int i=0;i<len; i++ ) {  
        arr[i] = i;
    }

    printf("%d\n", arr[5]);  
    //错误3:字符串的长度不确定,如果少于6个字符,就会出现数组越界,arr[5]应改为arr[len-1]

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 09:10:02 | 显示全部楼层

小甲鱼的作业中说,没学malloc,不让用。

参考『http://bbs.fishc.com/thread-70265-1-1.html』的第 5 个知识点 『变长数组 VLA』。

我这边试了用 scanf 接受一个固定的值,可以有动态数组的功能,但是统计的值,就会给我报『Segmentation』
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-25 09:14:24 | 显示全部楼层
Vision 发表于 2018-1-25 09:00
#include

#define MAX 1024

谢谢您耐心的解答,按照您给我的错误改正,但是没能解决我的问题,
将『错误1』修正成 char *str = NULL;
将『错误2』修正成 int len = 0;
『错误3』确实是多余的,这个是我的测试代码,一定会传5个值进去的。

参考『http://bbs.fishc.com/thread-70265-1-1.html』的第 5 个知识点 『变长数组 VLA』。

用『scanf』接受固定的 『int』值,可以用。『本帖问题-示例2』
自己统计出来的值不能用,奇怪在这里。『本帖问题-示例1』
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-25 10:49:27 | 显示全部楼层    本楼为最佳答案   
不让你用malloc造内存~ 你就再造个数组呗~
#include <stdio.h>

#define MAX 1024

int main(){
        
                char p_arr[MAX] = {0};
                char *str = p_arr;
        
        printf("请输入一个句子: ");
        fgets(str, MAX, stdin);

        int len = 0;
        while ( *str++ != '\0' ) {
                len++;
        }

        char arr[len];
        for ( int i=0; i<len; i++ ) {
                arr[i] = i;
        }

        printf("%d\n", arr[len-1]);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-1 09:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表