无法找到细分错误

时间:2017-04-26 10:59:10

标签: c arrays segmentation-fault

我需要帮助理解:

我试图理解我得到的分段错误:

  

分段错误(核心转储)

从SO和Google看,这似乎与尝试访问代码在某些范围内无法访问的内存有关。但是,我似乎无法弄清楚它在哪里发生。

我尝试做什么(期待):

我正在使用C编程语言,并试图解决练习2.4:squeeze(s1, s2) - 删除s1中s2中的所有字符实例。

我还没有触及动态阵列等,所以我只能做到这一点' (在最温和的意义上)使用简单的原始数据类型。我有更高级语言的经验!

我做了什么:

我在Windows 10计算机上运行CygWin并且编译器没有问题(gcc)。

以下是我为解决上述问题而撰写的代码:

/*
    Exercise 2.4
    squeeze (s1, s2): Remove all characters of s2 in s1.
    INPUT : s1.length >= s2 > 0.
    OUTPUT: The rest of s1 after deleting all occurances of letters in s2.
*/

#include <stdio.h>

void squeeze (char s1[], const char *s2);  /* Returns (by-ref) the resulting string s1 after removing all occurences of s2. */
int toUpper(char c);                      /* returns the numerical representation of a hexadecimal digit. */

int main () {
    char s1[] = "I am a test.\0";
    const char *s2 = "AE\0";
    printf("Before manipulation: %s\n", s1);
    squeeze(s1, s2);
    printf("After manipulation:  %s", s1);
}

/*
    Returns the (by-ref) resulting string s1 after removing all occurences
    of letters in s2.
*/

void squeeze (char s1[], const char *s2) {
    int index, s2_index, c = 0;

    while (s1[index] != '\0') {
        while(s2[s2_index] != '\0') {
            if ((c = toUpper(s1[index])) == s2[s2_index]){
                s1[index] = s1[index + 1];
            }
            s2_index++;
        }
        s2_index = 0;
        index++;
    }
}
/*
    Returns the upper-case representation of char c.
*/

int toUpper (char c) {
    if (c >= 'a' && c <= 'z')
        return c - 32;
    else
        return c;
}

干杯!如果您有任何疑问或者我错过了什么,请不要犹豫,发表评论! :)

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您需要初始化indexs2_index

更改:

int index, s2_index, c = 0;

到:

int index = 0, s2_index = 0, c = 0;

答案 1 :(得分:1)

从不在一行上写多个变量声明。这被认为是非常糟糕的做法,因为它更容易编写错误。 (坏书可能会教这种风格,提防坏书。)

int index, s2_index, c = 0;

与更易读的

相同
int index;
int s2_index;
int c = 0;

从可读版本中可以看出,您只将一个变量初始化为零。将代码更改为:

int index = 0;
int s2_index = 0;
int c = 0;

更好的是,您可以将循环去混淆为更易读的代码:

for(size_t i1=0; s1[i1] != '\0'; i1++)
{
  for(size_t i2=0; s2[i2] != '\0'; i2++)
  {
    ...
  }
}

你可能会注意到你应该增加&#34; index&#34;每次你复制一些东西,而不是在循环中的每一圈(?)。