不能strcpy分割错误

时间:2013-02-27 22:30:55

标签: segmentation-fault

我收到了分段错误

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

然后我只有一个名为spaces的变量,设置为5

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

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

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;
}

2 个答案:

答案 0 :(得分:1)

您的代码中有两个语法错误。您的编译器必须已经警告过您:

  

*温度= STR [1];

temp是char * [100],* temp相当于temp [0],它是char * 。但是str [i]是char。 所以你将char(单字节)放入char *(地址)。

  

strcpy(sepwords [i],temp);

temp是100个字符*的完整数组的地址,所以你要像一个大字符串一样复制,直到找到一个零字节。

还有这个错误:

  

string sepwords [spaces];

     

for(i = 0; i&lt; = spaces; i ++){

sepwords[i] = malloc(3000);

它是:我&lt;空格,而不是i&lt; =空格,因为字符串sepwords [spaces]分配一个“spaces”长度数组,从0到空格-1。

最后: 如果你的输入没有空格,那么while没有结束条件(str [i]!='') 这是你得到seg错误的地方(gdb是你的朋友),因为你最终会看到str的结尾(超过最后的\ 0字节)

答案 1 :(得分:0)

  1. 而不是将char *定义为字符串,将其定义为pchar。 char *不是字符串,它是指向字符的指针,可能是也可能不是字符的地址,可能在内存中跟随由0结尾的其他字符。这很重要因为undefined_pchar的值=分段错误。 undefined_string =“”。

  2. 的值
  3. fprintf(stderr, "Usage: %s pattern\n", progn);这打印出未定义的预测。它可能是非法内存,也可能是随机收集的内存。无论哪种情况都不好。因此,您应该在宣布预测时指明pchar progn = 0,表明您理解这一概念。

  4. sepwords是一个char *,sepwords [i]是一个char,通过说sepwords [i] = malloc(3000),如果它甚至可以编译,就会误用符号。使用pchar *来创建c样式字符串列表。

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

  5. 我很乐意尝试找出错误,但是通过评论或正确的类型用法,我必须清楚地了解您要尝试做什么。