silver-crow 发表于 2022-3-22 15:32:21

求助

#include <stdio.h>
#include <stdlib.h>
#define MAX 1024
int main()
{
    int i, num = 4;
    //scanf("%d", &num);
    char *pnames;
    char str;
    for(i = 0; i < num; i++)
    {
      //printf("我已经进入“输入相关队伍名称”的第%d次循环啦\n", i + 1);
      printf("请输入第%d个队伍的名称:", i + 1);
      fgets(str, MAX, stdin);
      pnames = 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);
    }
    return 0;
}

问题一:为什么num用scanf函数输入的时候,第一个for循环 i=0 的时候fgets函数不执行?
问题二:为什么这样执行下来pnames这个数组里每一个字符串都是上面for循环的第四次循环时fgets输入的内容?

ba21 发表于 2022-3-22 15:32:22

#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; // 指针数组:数组里面存放的是指针
    char *str;// char str; 改为手动申请

    for(i = 0; i < num; i++)
    {

      printf("请输入第%d个队伍的名称:", i + 1);
      str = malloc(sizeof(char)*MAX); // 手动申请内存
      fgets(str, MAX, stdin); // str数组只有1个,在你这例中不现实,后面的内容会覆盖前面的。解决办法,手动申请内存,手动释放。

      pnames = str; // 把str的地址存入pnames中。

      if(i == num - 1)
      {
            printf("队伍名称已录入完毕,正在计算比赛安排...\n");
      }
    }
    for(i = 0; i < num; i++)
    {
      printf("第%d个队伍的名称为:%s\n", i, pnames);
    }

    // 手动释放内存
    for(i = 0; i < num; i++)
    {
      free(pnames); // 把指针数组中地址指向的空间释放
    }

    return 0;
}
页: [1]
查看完整版本: 求助