我正在重新学习C语言.下面的代码段可以像预期的那样在Tmall C下编译和运行.它在GCC下编译没有任何问题,但在Windows10下不产生任何输出.当在Ubuntu下编译和运行时,Tmall C运行得一样好,但GCC报告了一个分段错误(核心转储).对于在GCC的领导下为什么会失败,我将不胜感激.蒂娅.

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

void UpCase(char * str);
void LowCase(char * str);

int main()
{
    void (* func)(char *) = &UpCase;
    func("Ab12Cd3EfG*h&");
    
    func = &LowCase;
    func("HiJ12kLm&No");
}

void UpCase(char * str)
{
    int i = 0;
    int ch = 0; 
    
    for(i=0; str[i] != '\0'; i++)
    {
        ch = (int)str[i] + 0;
        if(ch > 96 && ch < 123)
            str[i] = (char)(ch - 32);
    }
        
    printf("UpCase: %s\n", str);
}

void LowCase(char * str)
{
    int i = 0;
    int ch = 0; 
    
    for(i=0; str[i] != '\0'; i++)
    {
        ch = (int)str[i] + 0;
        if(ch > 64 && ch < 91)
            str[i] = (char)(ch + 32);
    }
        
    printf("LowCase: %s\n", str);
}
type here

我是一名退休的程序员,在用C#和T-SQL开发了几十年之后,我试图重新与C联系起来.自从90年代我在K&amp;R下写代码以来,我的C语言经验已经过时了.

推荐答案

修改字符串文字将调用undefined behavior.在某些系统上,字符串字面值被放置在只读区域,试图修改它们会导致程序终止.

应该用字符串声明数组并传递它们,而不是将字符串文字传递给修改输入字符串的函数.

int main()
{
    char str1[] = "Ab12Cd3EfG*h&";
    char str2[] = "HiJ12kLm&No";
    void (* func)(char *) = &UpCase;
    func(str1);
    
    func = &LowCase;
    func(str2);
}

C++相关问答推荐

代码打印正确输出次数过多(CS50)

如何将匿名VLA分配给指针?

常数函数指针优化

如何在Visual Studio代码中关闭此函数名称显示功能?

为什么在函数内部分配内存空间时需要添加符号?

轮询libusb_pollfd struct 列表的正确方式是什么?

是否可以通过调用两个函数来初始化2D数组?示例:ARRAY[STARTING_ROWS()][STARTING_COLUMNS()]

C指针概念分段故障

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

如何在提取的索引中分配空值?

链接到底是如何工作的,我在这里到底做错了什么

C语言中的外部关键字

递归打印二维数组(C编程)

C中的回文数字

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

浮点正零何时不全为零?

可以对两种 struct 类型中的任何一种进行操作的C函数

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

函数指针作为函数参数 - 应该使用 const 吗?

将十六进制值或十进制值分配给 uint16_t 有什么区别?