我需要帮助理解:
我试图理解我得到的分段错误:
分段错误(核心转储)
从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;
}
干杯!如果您有任何疑问或者我错过了什么,请不要犹豫,发表评论! :)
感谢您的帮助!
答案 0 :(得分:1)
您需要初始化index
和s2_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;每次你复制一些东西,而不是在循环中的每一圈(?)。