月晓空 2023-03-08 21:59 采纳率: 50%
浏览 26
已结题

《C PRIMER PLUS》的14.16程序疑惑

请问一下,这个《C PRIMER PLUS》的14.16程序在VS2022上出现“使用了可能为初始化的本地指针变量”pfun“”怎么解决呢?是因为这个程序本身就不完善吗?

#define _CRT_SECURE_NO_WARNINGS 1
// func_ptr.c -- 使用函数指针
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LEN 81
char* s_gets(char* st, int n);
char showmenu(void);
void eatline(void);    // 读取至行末尾
void show(void(*fp)(char*), char* str);
void ToUpper(char*);   // 把字符串转换为大写
void ToLower(char*);   // 把字符串转换为小写
void Transpose(char*);  // 大小写转置
void Dummy(char*);    // 不更改字符串
int main(void)
{
    char line[LEN];
    char copy[LEN];
    char choice;
    void(*pfun)(char*); // 声明一个函数指针,被指向的函数接受char *类型的参数,无返回值
    puts("Enter a string (empty line to quit):");
    while (s_gets(line, LEN) != NULL && line[0] != '\0')
    {
        while ((choice = showmenu()) != 'n')
        {
            switch (choice) // switch语句设置指针
            {
            case 'u': pfun = ToUpper;  break;
            case 'l': pfun = ToLower;  break;
            case 't': pfun = Transpose; break;
            case 'o': pfun = Dummy;   break;
            }
            strcpy(copy, line);  // 为show()函数拷贝一份
            show(pfun, copy);   // 根据用户的选择,使用选定的函数
        }
        puts("Enter a string (empty line to quit):");
    }
    puts("Bye!");
    return 0;
}
char showmenu(void)
{
    char ans;
    puts("Enter menu choice:");
    puts("u) uppercase    l) lowercase");
    puts("t) transposed case o) original case");
    puts("n) next string");
    ans = getchar();   // 获取用户的输入
    ans = tolower(ans);  // 转换为小写
    eatline();      // 清理输入行
    while (strchr("ulton", ans) == NULL)
    {
        puts("Please enter a u, l, t, o, or n:");
        ans = tolower(getchar());
        eatline();
    }
    return ans;
}
void eatline(void)
{
    while (getchar() != '\n')
        continue;
}
void ToUpper(char* str)
{
    while (*str)
    {
        *str = toupper(*str);
        str++;
    }
}
void ToLower(char* str)
{
    while (*str)
    {
        *str = tolower(*str);
        str++;
    }
}
void Transpose(char* str)
{
    while (*str)
    {
        if (islower(*str))
            *str = toupper(*str);
        else if (isupper(*str))
            *str = tolower(*str);
        str++;
    }
}
void Dummy(char* str)
{
    // 不改变字符串
}
void show(void(*fp)(char*), char* str)
{
    (*fp)(str);  // 把用户选定的函数作用于str
    puts(str);  // 显示结果
}
char* s_gets(char* st, int n)
{
    char* ret_val;
    char* find;
    ret_val = fgets(st, n, stdin);
    if (ret_val)
    {
        find = strchr(st, '\n');  // 查找换行符
        if (find)          // 如果地址不是NULL,
            *find = '\0';     // 在此处放置一个空字符
        else
            while (getchar() != '\n')
                continue;     // 清理输入行中剩余的字符
    }
    return ret_val;
}


  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2023-03-09 08:37
    关注

    编译器会认为pfun没有初始化,并且switch中也没有绝对的对pfun赋值的地方,case是不是一定能满足,编译器无法判断。所以给出了警告
    可以在void(*pfun)(char * );之后,加上 pfun = ToUpper; 进行初始化,应该就没事了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月10日
  • 已采纳回答 3月9日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 对于这个复杂问题的解释说明
  • ¥50 三种调度算法报错 采用的你的方案
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败