2015-09-10 55 views
0

我正在尝试编写一个函数,该函数接受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],但是,我得到一个segementation故障:11错误,我真的不知道如何解决这个问题?

+0

在故障点'm'的值是多少,缓冲区有多大'message'? – lurker

+0

''/ 0''应该是''\ 0''。这是一个复制错误还是在实际的代码? – Barmar

+0

如果我把“abcdh”,那么在分割的时刻m的值是5.“啊”它是2, – Cesar

回答

3

在这一行:

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

messagechar*类型,以便message[m]char类型,但%s期望一个char*

将错误类型传递到printf()的方法是未定义的行为。但它可能做的是将char的值解释为指针并尝试读取那里的内存。由于它不是有效的指针,因此它会出现分段错误。

解决方案,使用%c,打印char

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

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

+3

或者,您可以使用'printf(“%s \ n”,message + m);'打印从m开始的字符串结尾。 –

+2

@SergeBallesta:是,或者等价地是'printf(“%s \ n”,&message [m]);'。 – rodrigo

+0

你们真棒。非常感谢你! – Cesar

1

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