鱼C论坛

 找回密码
 立即注册
查看: 3192|回复: 5

[已解决]为什么fgets函数和gets函数会使循环终止?

[复制链接]
发表于 2022-3-22 00:30:16 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int j;
    char *pi[3];

    for(j = 0; j < 3; j++)
    {
        printf("请输入第%d个字符串:", j + 1);
        fgets(pi[j], 1024, stdin);
        //gets(pi[0]);

        printf("*pi[%d] = %s", j, pi[j]);
        printf("\n");
    }

    return 0;
}

问题1:执行第一次循环,输入第一个字符串后,循环在fgets函数或gets函数后直接终止了,这是什么原因?
问题2:想要输入一个字符串数组应该怎么做?
最佳答案
2022-3-22 00:30:17
本帖最后由 zzxhh628 于 2022-3-23 08:07 编辑

#include <stdio.h>
#include <stdlib.h>
#define MAX 1024

int main()
{
  int i;
    const int num = 4;
  char *pnames[3];

  for(i = 0; i < num; i++)
  {
  pnames[i]= malloc(MAX);
  fgets(pnames[i], MAX, stdin);
  printf("i = %d, num = %d\n", i, num);
  if(i == num-1)
  {
    printf("队伍名称已录入完毕,正在计算比赛安排...\n");
  }
  }

  return 0;
}
情况不确定,但是num如果不用修改的话尽量用const定义,以防止发生改变。

最佳答案

查看完整内容

#include #include #define MAX 1024 int main() { int i; const int num = 4; char *pnames[3]; for(i = 0; i < num; i++) { pnames= malloc(MAX); fgets(pnames, MAX, stdin); printf("i = %d, num = %d\n", i, num); if(i == num-1) { printf("队伍名称已录入完毕,正在计算比赛安排...\n"); } } return 0; } 情况不确定,但是num如果不用修改的话尽量用const定义 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-22 00:30:17 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 zzxhh628 于 2022-3-23 08:07 编辑

#include <stdio.h>
#include <stdlib.h>
#define MAX 1024

int main()
{
  int i;
    const int num = 4;
  char *pnames[3];

  for(i = 0; i < num; i++)
  {
  pnames[i]= malloc(MAX);
  fgets(pnames[i], MAX, stdin);
  printf("i = %d, num = %d\n", i, num);
  if(i == num-1)
  {
    printf("队伍名称已录入完毕,正在计算比赛安排...\n");
  }
  }

  return 0;
}
情况不确定,但是num如果不用修改的话尽量用const定义,以防止发生改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-22 08:15:01 From FishC Mobile | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

int main()
{
  int j;
  char *pi[3];

  for(j = 0; j < 3; j++)
  {
        pi[j]=malloc(1024);
  printf("请输入第%d个字符串:", j + 1);
  fgets(pi[j], 1024, stdin);
  //gets(pi[0]);

  printf("*pi[%d] = %s", j, pi[j]);
  printf("\n");
  }

  return 0;
}
改成这样就没问题了,使用字符指针数组应该给每个都分配空间,用malloc分配内存空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-22 13:25:24 | 显示全部楼层
本帖最后由 silver-crow 于 2022-3-22 14:11 编辑

#include <stdio.h>
#include <stdlib.h>
#define MAX 1024

int main()
{
    int i, num = 4;
    char *pnames[3];

    for(i = 0; i < num; i++)
    {
        pnames[i] = malloc(MAX);
        fgets(pnames[i], MAX, stdin);
        printf("i = %d, num = %d\n", i, num);
        if(i == num - 1)
        {
            printf("队伍名称已录入完毕,正在计算比赛安排...\n");
        }
    }

    return 0;
}


为什么第四次输出的时候num不等于4而是一串随机数?

4.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-23 08:19:56 From FishC Mobile | 显示全部楼层
使用完毕后要释放内存,后面加一个free(pnames[i])的循环,将所有元素分配的内存都释放掉。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-23 14:24:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 03:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表