鱼C论坛

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

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

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

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

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

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

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

  2. #define MAX 1024

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

  7.         int len;
  8.         while ( *str != '\0' ) {
  9.                 str++;
  10.                 len++;
  11.         }


  12.         char arr[len];
  13.         for ( int i=0; i<len; i++ ) {
  14.                 arr[i] = i;
  15.         }

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

  17.         return 0;
  18. }
复制代码


输出
  1. localhost:e26 Yuki$ gcc home2.c
  2. localhost:e26 Yuki$ ./a.out
  3. 请输入一个句子: I love
  4. Segmentation fault: 11
复制代码



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

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

  6.         char arr[n];
  7.         for ( int i=0; i<n; i++ ) {
  8.                 arr[i] = i;
  9.         }

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

  11.         return 0;
  12. }
复制代码


输出
  1. localhost:e26 Yuki$ gcc home2.c
  2. localhost:e26 Yuki$ ./a.out
  3. 请输入一个数字: 10
  4. 5
复制代码

最佳答案
2018-1-25 10:49:27
不让你用malloc造内存~ 你就再造个数组呗~
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main(){
  4.         
  5.                 char p_arr[MAX] = {0};
  6.                 char *str = p_arr;
  7.         
  8.         printf("请输入一个句子: ");
  9.         fgets(str, MAX, stdin);

  10.         int len = 0;
  11.         while ( *str++ != '\0' ) {
  12.                 len++;
  13.         }

  14.         char arr[len];
  15.         for ( int i=0; i<len; i++ ) {
  16.                 arr[i] = i;
  17.         }

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

  19.         return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


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

  3. #define MAX 1024

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

  9.         int len;
  10.         while(*str != '\0') {
  11.                 str++;
  12.                 len++;
  13.         }


  14.         char arr[len];
  15.         for(int i = 0; i<len; i++) {
  16.                 arr[i] = i;
  17.         }

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

  19.         return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-25 07:55:48 From FishC Mobile | 显示全部楼层
你的len没有初始化对它进行++得到的值是不确定的
小甲鱼最新课程 -> https://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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

我这边试了用 scanf 接受一个固定的值,可以有动态数组的功能,但是统计的值,就会给我报『Segmentation』
小甲鱼最新课程 -> https://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』
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. #define MAX 1024

  3. int main(){
  4.         
  5.                 char p_arr[MAX] = {0};
  6.                 char *str = p_arr;
  7.         
  8.         printf("请输入一个句子: ");
  9.         fgets(str, MAX, stdin);

  10.         int len = 0;
  11.         while ( *str++ != '\0' ) {
  12.                 len++;
  13.         }

  14.         char arr[len];
  15.         for ( int i=0; i<len; i++ ) {
  16.                 arr[i] = i;
  17.         }

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

  19.         return 0;
  20. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-6 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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