0

我得到一个分段错误

所以在顶部我有 typedef char * string;

然后我只有一个名为空格的变量,设置为 5 左右

for(i=0; i<=spaces; i++) {
    sepwords[i] = malloc(3000);
}

str 是一个字符数组,我正在寻找空格并复制到那时

while(str[i]!=' ') {


    printf("%d\n", i);
    strcpy(sepwords[i], "hello");
    i++;

}

所以这实际上有效

但是,如果我这样做

while(str[i]!=' ') {
    char *temp[100];
    *temp=str[i];


    printf("%d\n", i);
    strcpy(sepwords[i], *temp);
    i++;




}

它在这方面存在缺陷

我不认为这是因为我使用的是 typedef 字符串,因为我事先分配了内存。

有任何想法吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 256

char *progn;

void usage(void) {
    fprintf(stderr, "Usage: %s pattern\n", progn);
}
typedef char * string;

int pattern_match(char *pattern, char *str) {






int i=0;
int spaces=0;

while(str[i]!=0) {
    if(str[i]==' ') {
        spaces++;
    }
    i++;
}
string sepwords[spaces];





for(i=0; i<=spaces; i++) {
    sepwords[i] = malloc(3000);
}


i=0;


while(str[i]!=' ') {
    char *temp[100];
    *temp=str[i];


    printf("%d\n", i);
    strcpy(sepwords[i], temp);
    i++;




}









//printf("%d\n", spaces);



//strs[0]="hiya boy";
//printf(strs[1]);





}

int main(int argc, char **argv) {

    char line[MAXLINE];
    char *pattern;
    progn = argv[0];

    if (argc != 2) {
        usage();
        return EXIT_FAILURE;
    }
    pattern = argv[1];

    while (!feof(stdin) && !ferror(stdin)) {
        if (!fgets(line, sizeof (line), stdin)) {
            break;
        }
        if (pattern_match(pattern, line)) {
            printf("%s", line);
        }
    }
    if (ferror(stdin)) {
        perror(progn);
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}
4

2 回答 2

1

您的代码中有两个语法错误。你的编译器一定警告过你:

*temp=str[i];

temp 是 char*[100],* temp 等价于 temp[0],它是一个 char *。但是 str[i] 是字符。因此,您将 char (单字节)放入 char* (地址)中。

strcpy(sepwords[i], temp);

temp 是 100 个 char* 的完整数组的地址,因此您像一个大字符串一样复制,直到找到某个零字节。

还有这个错误:

字符串分隔符[空格];

for(i=0; i<=空格; i++) {

sepwords[i] = malloc(3000);

它是:i < 空格,而不是 i<=spaces,因为 string sepwords[spaces] 分配了一个“空格”长度的数组,从 0 到空格-1。

最后:如果您的输入不包含空格,则 while(str[i] != ' ') 没有结束条件这是您遇到段错误的地方(gdb 是您的朋友),因为您最终会照顾结束str (过去最后一个 \0 字节)

于 2013-02-27T23:00:47.800 回答
0
  1. 与其将 char* 定义为字符串,不如将其定义为 pchar。char* 不是字符串,它是指向字符的指针,它可能是也可能不是字符的地址,在内存中可能后面跟着以 0 结尾的其他字符。这很重要,因为 undefined_pchar 的值 = 分段错误。undefined_string = "" 的值。

  2. fprintf(stderr, "Usage: %s pattern\n", progn);这将打印未定义的 progn。它可能是非法内存,也可能是随机收集的内存。无论哪种情况都不好。所以你应该在声明你的 progn 时pchar progn = 0表明你理解这个概念。

  3. sepwords 是一个 char*,sepwords[i] 是一个 char,通过说 sepwords[i] = malloc(3000),如果它甚至可以编译,那将是对符号的滥用。改为使用 pchar* 来创建 c 样式字符串的列表。

    for(i=0; i<=spaces; i++) { sepwords[i] = malloc(3000); }

我很想尝试找出错误,但是意图必须有点清楚,我才能通过评论或正确的类型使用来理解您要做什么。

于 2013-02-27T22:32:21.987 回答