C 打印字符数组的值

C 打印字符数组的值,c,segmentation-fault,C,Segmentation Fault,我正在尝试编写一个函数,它接受一个const char*并对其进行迭代,直到它与const char*hello的第一个字符匹配。然后,它打印它必须前进的字符数和mth字符。到目前为止,我已经把它指向了我想要的地方,但我似乎无法访问它 const char* hello = "hello"; const char* no_bears = "ERROR: Message must contain 'THIS IS BEAR TERRITORY!' yeeee"; int is_commit_m

我正在尝试编写一个函数,它接受一个
const char*
并对其进行迭代,直到它与
const char*hello
的第一个字符匹配。然后,它打印它必须前进的字符数和
mth
字符。到目前为止,我已经把它指向了我想要的地方,但我似乎无法访问它

const char* hello = "hello";
const char* no_bears = "ERROR:  Message must contain 'THIS IS BEAR TERRITORY!' yeeee";

int is_commit_msg_ok(const char* msg) {
  /* COMPLETE THE REST */
  int m = 0;
  char* message = &msg[0];
  while (message[m] != hello[0]) {
    if (message[m] == '\0') {
        return 0;
    }
    m++;

  }
  printf("%d\n",m );
  printf("%s\n", message[m]); \\ causes segmentation fault
然而,当我执行消息[m]时,我得到了一个分段错误:11错误,我真的不知道如何修复这一点…

在这一行:

printf("%s\n", message[m]);
message
属于
char*
类型,因此
message[m]
属于
char
类型,但是
%s
需要
char*

将错误类型传递给
printf()
是未定义的行为。但它可能会将
char
值解释为指针,并尝试读取那里的内存。因为它不是一个有效的指针,所以会出现分段错误

解决方案,使用打印字符的
%c

printf("%c\n", message[m]);
如果启用这些警告,许多现代编译器将警告您此类错误。例如,在GCC/Clang中,您应该在这一行中真正使用
-Wall

printf("%s\n", message[m]);
message
属于
char*
类型,因此
message[m]
属于
char
类型,但是
%s
需要
char*

将错误类型传递给
printf()
是未定义的行为。但它可能会将
char
值解释为指针,并尝试读取那里的内存。因为它不是一个有效的指针,所以会出现分段错误

解决方案,使用打印字符的
%c

printf("%c\n", message[m]);

如果启用这些警告,许多现代编译器将警告您此类错误。例如,在GCC/Clang中,您应该真正使用
-Wall

您可以使用
printf(“%c\n”,message[m])因为您只打印单个字符而不是带有“%s”的字符串。

您可以使用
printf(“%c\n”,message[m])
因为您只打印单个字符,而不是带有“%s”的字符串。

故障点处
m
的值是多少,以及
消息的缓冲区有多大?
'/0'
应该是
'\0'
。这是一个复制错误还是在实际代码中?如果我加上“abcdh”,那么在分割的时刻m的值是5。“啊”是2,哦。哎呀。这是真实的代码。我会解决这个问题,如果这是实际的代码,那么带“\\”的注释呢?那不会编译!发生故障时,
m
的值是多少,缓冲区有多大?
'/0'
应该是
'\0'
。这是一个复制错误还是在实际代码中?如果我加上“abcdh”,那么在分割的时刻m的值是5。“啊”是2,哦。哎呀。这是真实的代码。我会解决这个问题,如果这是实际的代码,那么带“\\”的注释呢?那不会编译!或者,您可以使用
printf(“%s\n”,message+m)
打印从m开始的字符串结尾。@SergeBallesta:Yes,或等效地
printf(“%s\n”,&message[m])。你们真是太棒了。非常感谢大家!或者,您可以使用
printf(“%s\n”,message+m)
打印从m开始的字符串结尾。@SergeBallesta:Yes,或等效地
printf(“%s\n”,&message[m])。你们真是太棒了。非常感谢大家!