|
10鱼币
#include <stdio.h>
#include <stdlib.h>
#define MAX 1024
int main()
{
int i, num = 4;
//scanf("%d", &num);
char *pnames[num];
char str[MAX];
for(i = 0; i < num; i++)
{
//printf("我已经进入“输入相关队伍名称”的第%d次循环啦\n", i + 1);
printf("请输入第%d个队伍的名称:", i + 1);
fgets(str, MAX, stdin);
pnames[i] = str;
//printf("num = %d, i = %d\n", num, i);
if(i == num - 1)
{
printf("队伍名称已录入完毕,正在计算比赛安排...\n");
}
}
for(i = 0; i < num; i++)
{
printf("第%d个队伍的名称为:%s\n", i, pnames[i]);
}
return 0;
}
问题一:为什么num用scanf函数输入的时候,第一个for循环 i=0 的时候fgets函数不执行?
问题二:为什么这样执行下来pnames这个数组里每一个字符串都是上面for循环的第四次循环时fgets输入的内容?
- #include <stdio.h>
- #include <stdlib.h>
- #define MAX 1024
- int main()
- {
- int i, num;
-
- scanf("%d", &num);
- while(getchar()!='\n'); // 清空键盘缓冲区。(scanf获取%d在键盘缓冲区中会残留 回车 '\n')
- char *pnames[num]; // 指针数组:数组里面存放的是指针
- char *str;// char str[MAX]; 改为手动申请
- for(i = 0; i < num; i++)
- {
- printf("请输入第%d个队伍的名称:", i + 1);
- str = malloc(sizeof(char)*MAX); // 手动申请内存
- fgets(str, MAX, stdin); // str数组只有1个,在你这例中不现实,后面的内容会覆盖前面的。解决办法,手动申请内存,手动释放。
- pnames[i] = str; // 把str的地址存入pnames[i]中。
- if(i == num - 1)
- {
- printf("队伍名称已录入完毕,正在计算比赛安排...\n");
- }
- }
- for(i = 0; i < num; i++)
- {
- printf("第%d个队伍的名称为:%s\n", i, pnames[i]);
- }
- // 手动释放内存
- for(i = 0; i < num; i++)
- {
- free(pnames[i]); // 把指针数组中地址指向的空间释放
- }
- return 0;
- }
复制代码
|
|