|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 顶级太阳 于 2022-9-5 11:03 编辑
小甲鱼在s1e23中提出题目,要求这个输出结果。
给出的答案是
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- char *array[5] = {"FishC", "Five", "Star", "Good", "Wow"};
- char *(*p)[5] = &array;
- int i, j;
- for (i = 0; i < 5; i++)
- {
- for (j = 0; j < 5; j++)
- {
- if (i > strlen((*p)[j]) - 1)
- {
- break;
- }
- printf("%c ", (*p)[j][i]);
- }
- printf("\n");
- }
- return 0;
- }
复制代码
这个题目我已经琢磨了超过10天了(智商比较低,莫怪),实在不行,来看答案。分析这段代码,感觉第14行存疑。
if (i > strlen((*p)[j]) - 1)判断数组对应的元素是否到了末端,换句话说检查到字符串结束,就进行break了,不继续输出了。仔细观察给出的假设,最初设置的*array[5]中字符串长度,从前往后,长度分别为5,4,4,4,3.那么当第一个字符串到头的时候,后面所有的字符串都到头了。如果预存的字符串不是一个比一个短 呢?我尝试了一下,将“Five”改为“Five12345”,重新运行,得出结果符合我的顾虑,确实不能完成输出任务。
请教哪位能够把小甲鱼的答案改改,能够保证完整输出每一个可能出现的字符串,而不只是排好顺序,第一个字符串最长的情况。
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
- int main() {
- char *array[5] = {"FishC", "Five12345", "Star", "Good", "Wow"};
- size_t size[5] = {strlen(array[0]), strlen(array[1]), strlen(array[2]), strlen(array[3]), strlen(array[4])};
- for(size_t y = 0; ; ++y) {
- bool flag = true;
- for(size_t x = 0; x < 5; ++x) {
- if(y < size[x]) flag = false;
- }
- if(flag) break;
- for(size_t x = 0; x < 5; ++x) {
- if(y < size[x]) printf("%c ", array[x][y]);
- else printf(" ");
- }
- putchar('\n');
- }
- return 0;
- }
复制代码
|
评分
-
参与人数 1 | 荣誉 +5 |
鱼币 +5 |
贡献 +3 |
收起
理由
|
人造人
| + 5 |
+ 5 |
+ 3 |
学习认真,发现了bug |
查看全部评分
|