-1

我有一个字符串:“这是一个简单的字符串”

我的目标是找到(用strstr)“简单”并将其替换为“样本”。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main (int argc, char *argv[]){
    char *str;
    char *pch;

    int i=0;

    if((str=malloc(BUFSIZ))==NULL){
        printf("\n\t MEMORY ERROR");
        exit(1);
    }
    if((pch=malloc(BUFSIZ))==NULL){
        printf("\n\t MEMORY ERROR");
        exit(1);
    }
    str="This is a simple string ";
    pch=str;
    while(str[i]!='\0'){
        printf("%c",str[i]);
        i++;
    }
    printf(" -1break\n");

    while((*pch!='\0')){
        printf("%c",*pch);
        pch++;
    }
    printf(" -2break\n");

    printf("%s %d %d %d %d\n",str,strlen(str),sizeof(*str),BUFSIZ,(BUFSIZ-strlen(str)));/*OK*/

    if((pch=strstr(str,"simple"))!=NULL){
        printf("%s \n",pch);     **/*OK*/**         
        while((*pch!='\0')){
            printf("%c",*pch);
            pch++;
        }                           **/*SEG FAULT*/**
    strncpy(pch,"sample",6);
    printf("OK\n");
    }
    printf("%s %d\n",str,strlen(str));
    printf("\n");
    return 0;
}

输出:

$ ./strstr

This is a simple string  -1break

This is a simple string  -2break

This is a simple string  24 1 8192 8168

simple string  

Segmentation fault

$ 

问题:

不能用“样本”代替“简单”。

问题:

如果pch正确指向“简单”的“s”,为什么不能strncpy替换“样本”的 6 个字母?

4

2 回答 2

3

作为总结,你的str指针应该指向一个读/写内存区域,比如用//或静态字符数组分配的malloc内存callocrealloc比如char str[50]char str[] = "simple string";

char *str = "simple string",str这里指向一个文字字符串。并且文字字符串存储在只读内存区域中,因此您无法对其进行编辑

代码评论家:

1)首先以下行是错误的

str="This is a simple string ";

你已经为 str 分配了一个内存,然后你没有使用它你已经更改了指针。指针现在指向文字字符串(常量字符串)而不是其原始内存区域(使用 malloc 分配)。它应该是:

strcpy(str,"This is a simple string ");

同样的

pch = str;

pch指向相同的文字字符串str

pch=strstr(str,"simple")

pch这里也指向一个文字字符串,因为str它是一个文字刺

2)以下行是错误的

strncpy(pch,"sample",6);

pch指向文字字符串并复制到指向文字字符串的指针是未定义的行为,这会导致崩溃

代码固定:

int main (int argc, char *argv[]){
    char *str;
    char *pch;

    int i=0;

    if((str=malloc(BUFSIZ))==NULL){
        printf("\n\t MEMORY ERROR");
        exit(1);
    }

    strcpy (str, "This is a simple string ");
    if((pch=strstr(str,"simple"))!=NULL) {
        strncpy(pch,"sample",6);
    }
    printf("%s\n", str);
}
于 2013-04-29T13:39:11.300 回答
1

同意 MOHAMED 的回答。此外,由于您已经将“pch”移动到“\0”,即在strncpy之前的while循环中,导致了分段错误。strncpy 现在写入超出文字字符串“这是一个简单字符串”的末尾,导致分段错误。正如其他人所指出的,您还通过将 str (在 malloc 之后)重新分配给文字字符串而导致内存泄漏。

于 2013-04-29T13:48:31.630 回答