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])代码>。你们真是太棒了。非常感谢大家!