2016-03-07 82 views
0
#include <stdio.h> 

int any(char s1[], char s2[]) { 
    //converts to lower case 
    int c = 'a'; 
    int i1 = 0; 
    while (s1[i1] != '\0') { 
     if (s1[i1] >= 'A' && s1[i1] <= 'Z') 
      s1[i1] += 32; 
     ++i1; 
    } 
    int i2 = 0; 
    while (s2[i2] != '\0') { 
     if (s2[i2] >= 'A' && s2[i2] <= 'Z') 
      s2[i2] += 32; 
     ++i2; 
    } 
    i1 = 0; 
    while (s1[i1] != '\0') { 
     i2 = 0; 
     while (s2[i2] != '\0') { 
      if (s1[i1] == s2[i2]) 
       return i1; 
      ++i2; 
     } 
     ++i1; 
    } 
    return -1; 
} 

main() { 
    //printf("test"); 
    printf("%d", any("This is fun", "fin")); 
} 

此代码会导致分段错误,我敢肯定,当我尝试设置数组中的字符等于int的一个碰巧的各个指标。我该如何避免出现seg故障?设置字符数组等于整数

+0

@chqrlie:是的,压痕是个好主意,但没有规则,你必须加一个空格后的关键字(和二元运算可以去任何一种方式)。 –

+0

@chqrlie:我理解你的观点,但我的观点是你不应该强迫你这样看待别人。指导某人在关键词之后放置空格(就好像他们做了错误的事情一样)是可怜的形式,就像指示某人在拼写“颜色”后拼写“颜色”一样。 (另外,C的发明者现在已经死了,而且AFAIK没有参与进去。) –

+0

@SteveSummit:我的坏,Brian Kernighan没有发明C,他只是合作撰写* C语言编程*,所以* Go编程语言*。 RIP Dennis Ritchie。我同意在最初的评论中我有点强烈,但代码很糟糕,因为SO上的帖子太多了,而找到bug的第一步是通过'cb'运行。 – chqrlie

回答

0

您打电话给any指针指向字符串常量。尝试修改这些字符串会调用未定义的行为。

还要注意的是原型main应该int main(void)int main(int argc, char *argv[]),并main应该手术成功返回0

您正在实现一个带有多个字符的广义版本strchr的不区分大小写的版本,但不应该修改参数字符串,而应该依赖<ctype.h>中的函数,而不是使用ASCII。

这里是一个更好的版本:

#include <ctype.h> 
#include <stdio.h> 

int any(const char s1[], const char s2[]) { 
    int i1 = 0; 
    while (s1[i1] != '\0') { 
     int i2 = 0; 
     while (s2[i2] != '\0') { 
      if (tolower((unsigned char)s1[i1]) == tolower((unsigned char)s2[i2])) 
       return i1; 
      ++i2; 
     } 
     ++i1; 
    } 
    return -1; 
} 

int main(void) { 
    //printf("test"); 
    printf("%d", any("This is fun", "fin")); 
    return 0; 
}