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 17:09 编辑
for (int j = 0;(*ptr) != '\0'&&j<5; j++) {//&&j<5,没有 i=1,j=5,(*ptr)已经越界而不遇到‘\0’,就是死循环
printf("%c ",(*ptr));
} 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放在前面才能正常执行 gandixiwang 发表于 2022-9-11 17:45
有个小失误,我调试了下才发现
把j
短路原理,执行j<5为假,后面的就不执行了
放后面有越界 gandixiwang 发表于 2022-9-11 17:45
有个小失误,我调试了下才发现
把j
放前放后无所谓吧,只是两个比较语句,没有涉及量的改变。我放在后面正常执行了。 本帖最后由 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;
}
这样子也行
不过我想不通为什么会有个%在那
jhq999 发表于 2022-9-11 17:52
短路原理,执行j
。。。我这边执行没问题呀{:10_243:} 本帖最后由 gandixiwang 于 2022-9-11 18:11 编辑
须弥芥子 发表于 2022-9-11 18:07
。。。我这边执行没问题呀
额,可能你的编译器没那么严格吧,越界一两个格不会报错,越多了才会
我好像听小甲鱼的课说过这回事 gandixiwang 发表于 2022-9-11 18:09
额,可能你的编译器没那么严格吧,越界一两个格不会报错,越多了才会
我好想听小甲鱼的课说过这回事
原来如此,感谢解惑{:10_256:} gandixiwang 发表于 2022-9-11 18:05
这样子也行
不过我想不通为什么会有个%在那
char* str = {"FishC", "Five", "Star", "Good","WoW","\0"};
这里不需要加"\0"吧 须弥芥子 发表于 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]