注册 登录
编程论坛 C语言论坛

为什么调试会出现这个错误

chenbingjy 发布于 2025-06-02 15:21, 1380 次点击
代码:
#include<stdio.h>
#include<string.h>
char * substr(char *str,int n)
{
    unsigned char len=strlen(str);
    for(;len>0;len--)
    {
        if(str[len-1]==' ')
            str[len-1]=0;
    }
    for(;n>0;n--)
    {
        str+=(strlen(str)+1);
    }
    return str;
   
}

int main(void)
{
    char *str1;
    char *str="123 456 789";
    *str1=substr(str,2);
    printf("str1 =%s\n",*str1);
    return 0;
}
调试
第一个for循环运行三次时,提示错误:
Thread 1 received signal SIGSEGV Segmentation fault
请问高手,如何解决?谢谢
5 回复
#2
forever742025-06-02 18:13
字符串这个东西有点麻烦。
主函数里你的str是一个指针,它所表示的那个字符串,在多数国内教材里叫做字符串常量。
常量的意思是不许修改。
然后你企图修改。
所以报错。
需要修改的话,主函数里用一个字符数组保存内容。
#3
forever742025-06-02 18:16
另外应该是
str1=sub...
而不是
*str1=sub...

应该是
printf("...%s...",str1);

[此贴子已经被作者于2025-6-2 18:17编辑过]

#4
rjsp2025-06-02 19:05
看不懂,连个题目或要求都没有
#5
rjsp2025-06-03 08:50
程序代码:
#include <stdio.h>
#include <string.h>

char* substr( const char* str, size_t n, size_t* len )
{
    const char* p = str;
    for( ; n!=0 && *p; ++p )
        n -= (*p==' ');

    *len = 0;
    for( ; p[*len]!=0 && p[*len]!=' '; ++*len );

    return (char*)p;
}

int main(void)
{
    const char* str = "123 456 789";
    const char* p;
    size_t len;

    p = substr( str, 0, &len );
    printf( "str0 = \"%.*s\"\n", (int)len, p );

    p = substr( str, 1, &len );
    printf( "str1 = \"%.*s\"\n", (int)len, p );

    p = substr( str, 2, &len );
    printf( "str2 = \"%.*s\"\n", (int)len, p );

    p = substr( str, 3, &len );
    printf( "str3 = \"%.*s\"\n", (int)len, p );

    p = substr( str, 4, &len );
    printf( "str4 = \"%.*s\"\n", (int)len, p );
}

输出
str0 = "123"
str1 = "456"
str2 = "789"
str3 = ""
str4 = ""



[此贴子已经被作者于2025-6-3 08:52编辑过]

#6
rjsp2025-06-03 09:20
贴个C++的代码(虽然C++用在这里并没有任何优势)

程序代码:
#include <string>
#include <string_view>
#include <ranges>
#include <print>

std::string substr( std::string_view str, size_t n )
{
    return { std::from_range, *(str | std::views::split(' ') | std::views::drop(n) | std::views::take(1)).begin() };
}

int main( void )
{
    const char* str = "123 456 789";
    std::println( "str{} = \"{}\"", 0, substr(str,0) );
    std::println( "str{} = \"{}\"", 1, substr(str,1) );
    std::println( "str{} = \"{}\"", 2, substr(str,2) );
    std::println( "str{} = \"{}\"", 3, substr(str,3) );
    std::println( "str{} = \"{}\"", 4, substr(str,4) );
}


1