C 为什么我会出现这种分割错误?

C 为什么我会出现这种分割错误?,c,C,我正在做一个我的预实验,在这个实验中,我应该获取预定义的字符串并打印它们,如果它们都是大写、小写、有数字或混合体。然而,我不断得到一个分段错误(核心转储)。我试过调试,但我不知道问题出在哪里。感谢您的帮助 这是我的主要任务 #define DIGITTEST1 "12345abcd67890" #define DIGITTEST2 "1234567890" #define LOWERTEST1 "hifromJimRies" #define LOWERTEST2 "hifromjimries"

我正在做一个我的预实验,在这个实验中,我应该获取预定义的字符串并打印它们,如果它们都是大写、小写、有数字或混合体。然而,我不断得到一个分段错误(核心转储)。我试过调试,但我不知道问题出在哪里。感谢您的帮助

这是我的主要任务

#define DIGITTEST1 "12345abcd67890"
#define DIGITTEST2 "1234567890"
#define LOWERTEST1 "hifromJimRies"
#define LOWERTEST2 "hifromjimries"
#define UPPERTEST1 "JIMRIESWASHERE"
#define UPPERTEST2 "JIMRIESWASHERe"
#define ONEMORETEST "9jimr"

void PrintCategory(char *s);

int main(void)
{
PrintCategory(DIGITTEST1);
PrintCategory(DIGITTEST2);
PrintCategory(LOWERTEST1);
PrintCategory(LOWERTEST2);
PrintCategory(UPPERTEST1);
PrintCategory(UPPERTEST2);
PrintCategory(ONEMORETEST);
}
这是我的stringfunc.c

 #include<stdio.h>
    #include<ctype.h>
    #define DIGITTEST1 "12345abcd67890"
    #define DIGITTEST2 "1234567890"
    #define LOWERTEST1 "hifromJimRies"
    #define LOWERTEST2 "hifromjimries"
    #define UPPERTEST1 "JIMRIESWASHERE"
    #define UPPERTEST2 "JIMRIESWASHERe"
    #define ONEMORETEST "9jimr"

void PrintCategory(char *s)
{
  if (isdigit (DIGITTEST1))
    {
      printf ("%s is all digits\n", DIGITTEST1);
    }
  else
    {
      printf ("%s is a mix of various types of characters\n", DIGITTEST1);
    }

  if (isdigit (DIGITTEST2))
    {
      printf ("%s is all digits\n", DIGITTEST2);
    }
  else
    {
      printf ("%s is a mix of various types of characters\n", DIGITTEST2);
    }
  if (islower (LOWERTEST1))
    {
      printf ("%s is all lower case\n", LOWERTEST1);
    }
  else
    {
      printf ("%s is a mix of various types of characters\n", LOWERTEST1);
    }
  if (islower (LOWERTEST2))
    {
      printf ("%s is all lower case\n", LOWERTEST2);
    }
  else
    {
      printf ("%s is a mix of various types of characters\n", LOWERTEST2);
    }
  if (isupper (UPPERTEST1))
    {
      printf ("%s is all upper casae\n", UPPERTEST1);
    }
  else
    {
      printf ("%s is a mix of various types of characters\n", UPPERTEST1);
    }
  if (isupper (UPPERTEST2))
    {
      printf ("%s is all upper case\n", UPPERTEST2);
    }
  else
    {
      printf ("%s is a mix of various types of characters\n", UPPERTEST2);
    }
  if (islower (ONEMORETEST))
    {
      printf ("%s is all lower case\n", ONEMORETEST);
    }
  else
    {
      printf ("%s is a mix of various types of characters\n", ONEMORETEST);
    }

}
#包括
#包括
#定义数字测试1“12345abcd67890”
#定义DIGITTEST2“1234567890”
#定义LOWERTEST1“hifromJimRies”
#定义最低级的2“hifromjimries”
#定义UPPERTEST1“JIMRIESWASHERE”
#定义UPPERTEST2“JIMRIESWASHERe”
#定义ONEMORETEST“9jimr”
无效打印类别(字符*s)
{
if(isdigit(DIGITTEST1))
{
printf(“%s是所有数字\n”,DIGITTEST1);
}
其他的
{
printf(“%s是各种类型字符的混合体\n”,DIGITTEST1);
}
if(isdigit(DIGITTEST2))
{
printf(“%s”是所有数字\n“,DIGITTEST2);
}
其他的
{
printf(“%s是各种类型字符的混合体\n”,DIGITTEST2);
}
如果(岛下(最低点1))
{
printf(“%s”全是小写\n“,LOWERTEST1);
}
其他的
{
printf(“%s是各种类型字符的混合体\n”,LOWERTEST1);
}
如果(岛下(最低点2))
{
printf(“%s”全是小写\n“,LOWERTEST2);
}
其他的
{
printf(“%s是各种类型字符的混合体\n”,LOWERTEST2);
}
如果(isupper(UPPERTEST1))
{
printf(“%s都是上casae\n”,UPPERTEST1);
}
其他的
{
printf(“%s是各种类型字符的混合体\n”,UPPERTEST1);
}
如果(isupper(UPPERTEST2))
{
printf(“%s”全是大写\n“,UPPERTEST2);
}
其他的
{
printf(“%s是各种类型字符的混合体\n”,UPPERTEST2);
}
如果(islower(ONEMORETEST))
{
printf(“%s”全是小写\n“,ONEMORETEST);
}
其他的
{
printf(“%s是各种类型字符的混合体\n”,ONEMORETEST);
}
}

来自ctype.h的函数(例如
isdigit
islower
等)正在处理字符。他们的参数类型为
int
。但是,您要向它传递一个字符串(键入
char*
)。这是可以编译的,因为
char*
可以隐式转换为
int
。但是,在这种情况下,代码是不正确的,并导致未定义的行为(在这种情况下是分段错误)

编译器会警告您此错误。例如,当我编译代码时,会收到以下警告:

stringfunc.c:在函数“PrintCategory”中:
stringfunc.c:13:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:22:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:30:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:38:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:46:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:54:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:62:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]

如果使用gcc(其他编译器可能有类似的选项),我强烈建议使用编译器选项
-Wall
-Werror
进行编译,以避免此类编程错误。使用
-Werror
此代码不会编译。

来自ctype.h的函数(例如
isdigit
islower
等)正在处理字符。他们的参数类型为
int
。但是,您要向它传递一个字符串(键入
char*
)。这是可以编译的,因为
char*
可以隐式转换为
int
。但是,在这种情况下,代码是不正确的,并导致未定义的行为(在这种情况下是分段错误)

编译器会警告您此错误。例如,当我编译代码时,会收到以下警告:

stringfunc.c:在函数“PrintCategory”中:
stringfunc.c:13:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:22:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:30:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:38:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:46:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:54:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]
stringfunc.c:62:7:警告:从指针转换为不同大小的整数[-Wpointer到int cast]

如果使用gcc(其他编译器可能有类似的选项),我强烈建议使用编译器选项
-Wall
-Werror
进行编译,以避免此类编程错误。使用
-Werror
此代码不会编译。

将字符数组传递给isdigit函数,如下所示

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005cf in PrintCategory (s=0x400880 "12345abcd67890") at String.c:13
13    if (isdigit (DIGITTEST1))
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64

将字符数组传递给isdigit函数,如下所示

Program received signal SIGSEGV, Segmentation fault.
0x00000000004005cf in PrintCategory (s=0x400880 "12345abcd67890") at String.c:13
13    if (isdigit (DIGITTEST1))
Missing separate debuginfos, use: debuginfo-install glibc-2.17-292.el7.x86_64

如果启用编译器警告,则应获取有关使用
isdigit
的消息
is
函数使用
char
。您正在向它们传递一个字符串。@kaylum事实上,它们接受一个
int
值,该值必须在0到UCHAR之间_MAX@M.M是的,你是对的。我的错。希望OP不会对此感到困惑,并理解潜在的问题。但是在函数中忽略的
s
传递有什么意义呢?我不认为任务的目的是让函数硬编码函数中的所有检查。相反,函数应该对传入的字符串执行检查。和
main