最近开始学习C语言,多次遇到从<string.h>
调用strcat函数的错误模块导致段错误。我在网上搜索了答案,包括 this stackoverflow post , 没有成功。我认为这个社区可能对这个问题有更个人化的见解,因为一般的解决方案似乎并不奏效。可能是用户错误,可能是代码的个人问题。看一看。
#include <stdio.h>
#include <string.h>
char * deblank(const char str[]){
char *new[strlen(str)];
char *buffer = malloc(strlen(new)+1);
for (int i=0; i<strlen(*str); i++){
if(buffer!=NULL){
if(str[i]!=" "){
strcat(new,str[i]); //Segmentation fault
}
}
}
free(buffer);
return new;
}
int main(void){
char str[] = "This has spaces in it.";
char new[strlen(str)];
*new = deblank(str);
puts(new);
}
我已经在我追踪到段错误的行上发表了评论。以下是一些 Java 代码,可以从这个 C 代码中获得一些意义。
public class deblank {
public static void main(String[]args){
String str = "This has space in it.";
System.out.println(removeBlanks(str));
}
public static String removeBlanks(String str){
String updated = "";
for(int i=0; i<str.length(); i++){
if(str.charAt(i)!=' '){
updated+=str.charAt(i);
}
}
return updated;
}
}
任何对此错误的见解将不胜感激。也请指出错别字……众所周知,我会犯错。谢谢。
最佳答案
好的,让我们开始吧。
#include <stdio.h>
#include <string.h>
char * deblank(const char str[]){
char *new[strlen(str)];
^ 这一行创建了一个指针数组,而不是一个字符串。
char *buffer = malloc(strlen(new)+1);
malloc
未声明。缺少 #include <stdlib.h>
.此外,您应该在此处检查分配失败。
strlen(new)
是类型错误。 strlen
需要 char *
但是new
是(或者更确切地说是评估为)char **
.
for (int i=0; i<strlen(*str); i++){
strlen(*str)
是类型错误。 strlen
需要 char *
但是*str
是 char
(即单个字符)。
i<strlen(...)
值得怀疑。 strlen
返回 size_t
(无符号类型)而 i
是一个 int
(签名,可能太小了)。
调用 strlen
in a loop 是低效的,因为它必须遍历整个字符串才能找到结尾。
if(buffer!=NULL){
这是检查分配失败的奇怪地方。另外,您不使用 buffer
任何地方,那么为什么要创建/检查它呢?
if(str[i]!=" "){
str[i]!=" "
是类型错误。 str[i]
是 char
而" "
是(或者更确切地说是评估为)char *
.
strcat(new,str[i]); //Segmentation fault
这是一个类型错误。 strcat
接受两个字符串( char *
),但是 new
是 char **
和 str[i]
是 char
.此外,strcat
的第一个参数必须是有效字符串但 new
未初始化。
}
}
}
free(buffer);
return new;
new
是这个函数中的局部数组。您正在返回它的第一个元素的地址,这是没有意义的:一旦函数返回,它的所有局部变量都消失了。您在此处返回无效指针。
此外,这是一个类型错误:deblank
声明返回一个 char *
但实际上返回一个 char **
.
}
int main(void){
char str[] = "This has spaces in it.";
char new[strlen(str)];
*new = deblank(str);
这是类型错误:*new
是 char
但是deblank
返回 char *
.
puts(new);
puts
接受一个字符串,但是 new
在这一点上本质上是垃圾。
}
关于c - strcat 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307971/