猴子请来的救兵 发表于 2018-1-25 00:05:33

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

伟大的鱼油们,学习『带你学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;
        for ( int i=0; i<len; i++ ) {
                arr = i;
        }

        printf("%d\n", arr);

        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;
        for ( int i=0; i<n; i++ ) {
                arr = i;
        }

        printf("%d\n", arr);

        return 0;
}

输出
localhost:e26 Yuki$ gcc home2.c
localhost:e26 Yuki$ ./a.out
请输入一个数字: 10
5

人造人 发表于 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;
        for(int i = 0; i<len; i++) {
                arr = i;
        }

        printf("%d\n", arr);

        return 0;
}

wjp 发表于 2018-1-25 07:55:48

你的len没有初始化对它进行++得到的值是不确定的

Vision 发表于 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;   //仅仅是统计字符串长度的话,这个语句块是多余的。
    for ( int i=0;i<len; i++ ) {
      arr = i;
    }

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

    return 0;
}

猴子请来的救兵 发表于 2018-1-25 09:10:02

人造人 发表于 2018-1-25 00:12


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

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

我这边试了用 scanf 接受一个固定的值,可以有动态数组的功能,但是统计的值,就会给我报『Segmentation』

猴子请来的救兵 发表于 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』

风过无痕丶 发表于 2018-1-25 10:49:27

不让你用malloc造内存~ 你就再造个数组呗~
#include <stdio.h>

#define MAX 1024

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

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

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

      printf("%d\n", arr);

      return 0;
}
页: [1]
查看完整版本: 学习『带你学C带你飞』第26集,字符串统计的长度,为啥不能作为数组的变量长度?