当我试图在将字符串"存储"为指针变量时操纵字符串时,遇到了一个障碍。
// Sample code to input a string till line break is encountered, later re-allocating to save space
char *s = malloc(1024 * sizeof(char));
scanf("%[^n]", s);
s = realloc(s, strlen(s) + 1);
// Code to replace whitespaces with newlines
for (char *c = s; *c != ' '; c++) {
if (*c == ' ') {
*c = 'n';
}
}
printf("%s", s);
我想在上面的代码片段中解释char *c = s
,因为当我试图使用相同的概念来迭代中的字符串时,另一个例子(下面(中的字符串字符时,我遇到了Segmentation fault运行时错误。
我想从用户输入的字符串中找到数字(0到9(的频率:
int count[10];
char *s = malloc(1024 * sizeof(char));
scanf("%[^n]", &s);
s = realloc(s, strlen(s) + 1);
for(char *c = s; *c != ' '; c++) { // Shows Segementation fault here
if(*c >= '0' && *c <= '9') {
count[*c - '0'] += 1; // I am still trying to work this
}
}
在scanf中,您正在使用&s而不是s
char *c = s
:的解释
在该语句中,指针c被设置为与for循环的第一次迭代的指针s相同的地址。这意味着,c和s指向相同的内存位置。然后,对于for循环的每一次进一步迭代,c都会递增(c++(,并且只要取消引用的内存位置(内存位置的内容(不是空字符,就执行for循环。
现在对于分段错误,由于您没有发布不起作用的代码,我只能猜测。一种猜测可能是,分配的内存中没有空字符,因此for循环停止得不够快,并将c指针增加到比malloc分配的地址更高的地址。通过取消引用它,您可以访问分配内存之外的内存位置。这可能会产生分段故障。
编辑:啊,现在我看到你添加了不工作的代码。是的,Akshay的答案是对的,分段错误可能已经发生在那里了,因为你不扫描到s,而是扫描到保存指针变量的内存位置。s指向的数组仍然未初始化(未知值(,但您使用strlen搜索第一个出现的null字符。现在,realloc可能会失败,从而返回NULL,然后将c指针设置为NULL。这也会产生分割错误。