我需要帮助的理解:
我正在尝试了解我遇到的细分错误:
分割故障(核心倾倒(
通过查看SO和Google,这似乎与尝试访问内存有关,代码在某些范围中无法访问。但是,我似乎无法弄清楚它发生在哪里。
我要做的(期望(:
我正在以C编程语言进行关注,并正在尝试解决练习2.4:squeeze(s1, s2)
-删除S2中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. ";
const char *s2 = "AE ";
printf("Before manipulation: %sn", 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] != ' ') {
while(s2[s2_index] != ' ') {
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;
}
欢呼!如果您有任何疑问或错过了什么,请随时发表评论!:(
感谢您的帮助!
从不在一行上写多个变量声明。这被认为是非常糟糕的练习,因为它更容易编写错误。(坏书可能会教这种风格,提防坏书。(
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] != ' '; i1++)
{
for(size_t i2=0; s2[i2] != ' '; i2++)
{
...
}
}
您可能会注意到,每次复制某些内容,而不是在循环中的每个圈子(?(。
您需要初始化index
和s2_index
。
更改:
int index, s2_index, c = 0;
to:
int index = 0, s2_index = 0, c = 0;