须弥芥子 发表于 2022-9-11 15:44:37

S1E23的作业,关于for循环的一个小疑问

抛开字符数组的越界访问不谈,这两种写法为什么输出不一样呢?

终止条件在循环体内:
#include <stdio.h>
#include <string.h>
int main()
{
    char* str = {"FishC", "Five", "Star", "Good","WoW"};
    char* (*ptr) = &str;

    int max = strlen((*ptr));

    for (int i = 0; i < 5; i++) {
      max = strlen((*ptr)) > max ? strlen((*ptr)) : max;
    }


    for (int i = 0; i <= max - 1; i++) {
      for (int j = 0;j < 5; j++) {
            if((*ptr) == '\0'){
                break;
            }
            printf("%c ",(*ptr));
      }
      printf("\n");
    }

    return 0;
}
输出:
F F S G W
i i t o o
s v a o w
h e r d
C

Process finished with exit code 0

终止条件放在for语句内:
#include <stdio.h>
#include <string.h>
int main()
{
    char* str = {"FishC", "Five", "Star", "Good","WoW"};
    char* (*ptr) = &str;

    int max = strlen((*ptr));

    for (int i = 0; i < 5; i++) {
      max = strlen((*ptr)) > max ? strlen((*ptr)) : max;
    }


    for (int i = 0; i <= max - 1; i++) {
      for (int j = 0;(*ptr) != '\0'; j++) {
            printf("%c ",(*ptr));
      }
      printf("\n");
    }

    return 0;
}
输出:F F S G W
i i t o o ?
Process finished with exit code -1073741819 (0xC0000005)

jhq999 发表于 2022-9-11 16:37:32

本帖最后由 jhq999 于 2022-9-11 17:09 编辑

for (int j = 0;(*ptr) != '\0'&&j<5; j++) {//&&j<5,没有 i=1,j=5,(*ptr)已经越界而不遇到‘\0’,就是死循环
            printf("%c ",(*ptr));
      }

gandixiwang 发表于 2022-9-11 17:45:47

jhq999 发表于 2022-9-11 16:37


有个小失误,我调试了下才发现for (int j = 0;j<5 &&(*ptr) != '\0'; j++) {//&&j<5,没有 i=2,j=5,(*ptr)已经越界而不遇到‘\0’,就是死循环
            printf("%c ",(*ptr));
      }
把j<5放在前面才能正常执行

jhq999 发表于 2022-9-11 17:52:55

gandixiwang 发表于 2022-9-11 17:45
有个小失误,我调试了下才发现
把j

短路原理,执行j<5为假,后面的就不执行了
放后面有越界

须弥芥子 发表于 2022-9-11 17:54:34

gandixiwang 发表于 2022-9-11 17:45
有个小失误,我调试了下才发现
把j

放前放后无所谓吧,只是两个比较语句,没有涉及量的改变。我放在后面正常执行了。

gandixiwang 发表于 2022-9-11 18:05:17

本帖最后由 gandixiwang 于 2022-9-11 18:07 编辑

#include <stdio.h>
#include <string.h>
int main()
{
        char* str = {"FishC", "Five", "Star", "Good","WoW","\0"};
        char* (*ptr) = &str;
       
        int max = strlen((*ptr));
       
        for (int i = 0; i < 5; i++) {
                max = (int)strlen((*ptr)) > max ? strlen((*ptr)) : max;
        }
       
       
        for (int i = 0; i <= max - 1; i++) {
                for (int j = 0;(*ptr) != '\0'; j++) {
                        printf("%c ",(*ptr));
                }
                printf("\n");
        }
       
        return 0;
}
这样子也行
不过我想不通为什么会有个%在那

须弥芥子 发表于 2022-9-11 18:07:07

jhq999 发表于 2022-9-11 17:52
短路原理,执行j

。。。我这边执行没问题呀{:10_243:}

gandixiwang 发表于 2022-9-11 18:09:42

本帖最后由 gandixiwang 于 2022-9-11 18:11 编辑

须弥芥子 发表于 2022-9-11 18:07
。。。我这边执行没问题呀

额,可能你的编译器没那么严格吧,越界一两个格不会报错,越多了才会
我好像听小甲鱼的课说过这回事

须弥芥子 发表于 2022-9-11 18:11:55

gandixiwang 发表于 2022-9-11 18:09
额,可能你的编译器没那么严格吧,越界一两个格不会报错,越多了才会
我好想听小甲鱼的课说过这回事

原来如此,感谢解惑{:10_256:}

须弥芥子 发表于 2022-9-11 19:16:52

gandixiwang 发表于 2022-9-11 18:05
这样子也行
不过我想不通为什么会有个%在那

      char* str = {"FishC", "Five", "Star", "Good","WoW","\0"};
这里不需要加"\0"吧

gandixiwang 发表于 2022-9-11 20:09:59

须弥芥子 发表于 2022-9-11 19:16
这里不需要加"\0"吧

加了“\0”的话,它这里就可以检测到边界了,就不用加就j<5,不过我不知道为什么它打印出来的时候会多出个“%”.
      for (int i = 0; i <= max - 1; i++) {
                for (int j = 0;(*ptr) != '\0'; j++) {
                        printf("%c ",(*ptr));
                }
                printf("\n");
      }
页: [1]
查看完整版本: S1E23的作业,关于for循环的一个小疑问