silver-crow 发表于 2022-3-22 00:30:16

为什么fgets函数和gets函数会使循环终止?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int j;
    char *pi;

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

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

    return 0;
}

问题1:执行第一次循环,输入第一个字符串后,循环在fgets函数或gets函数后直接终止了,这是什么原因?
问题2:想要输入一个字符串数组应该怎么做?

zzxhh628 发表于 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;

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定义,以防止发生改变。

zzxhh628 发表于 2022-3-22 08:15:01

#include <stdio.h>
#include <stdlib.h>

int main()
{
int j;
char *pi;

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

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

return 0;
}
改成这样就没问题了,使用字符指针数组应该给每个都分配空间,用malloc分配内存空间。

silver-crow 发表于 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;

    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不等于4而是一串随机数?

zzxhh628 发表于 2022-3-23 08:19:56

使用完毕后要释放内存,后面加一个free(pnames)的循环,将所有元素分配的内存都释放掉。

a1372245671 发表于 2022-3-23 14:24:05

{:10_317:}
页: [1]
查看完整版本: 为什么fgets函数和gets函数会使循环终止?