c - strcat 上的段错误

标签 c segmentation-fault strcat

最近开始学习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 *但是*strchar (即单个字符)。

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 * ),但是 newchar **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);

这是类型错误:*newchar但是deblank返回 char * .

    puts(new);

puts接受一个字符串,但是 new在这一点上本质上是垃圾。

}

关于c - strcat 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45307971/

相关文章:

C++ strcat 创建无限循环

c - 如何将一个字符连接成一个字符串?

c - 为什么我不能修改 c 中的字符串文字?

python - PyErr_CheckSignals 没有接收到信号

c - C99中 "arithmetic operation"的定义是什么?

C stdio 重定向到子进程或从子进程重定向

c++ - 为 vector<string> 预留更大容量后发生段错误

c - 无法调试导致 shell 出现段错误的 .so 库

c++ - 为什么将 'char' 分配给 'char' 会产生段错误? C++

c - strcat() 的访问冲突