我收到了分段错误
所以在顶部我有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;
}
答案 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)
而不是将char *定义为字符串,将其定义为pchar。 char *不是字符串,它是指向字符的指针,可能是也可能不是字符的地址,可能在内存中跟随由0结尾的其他字符。这很重要因为undefined_pchar的值=分段错误。 undefined_string =“”。
fprintf(stderr, "Usage: %s pattern\n", progn);
这打印出未定义的预测。它可能是非法内存,也可能是随机收集的内存。无论哪种情况都不好。因此,您应该在宣布预测时指明pchar progn = 0
,表明您理解这一概念。
sepwords是一个char *,sepwords [i]是一个char,通过说sepwords [i] = malloc(3000),如果它甚至可以编译,就会误用符号。使用pchar *来创建c样式字符串列表。
for(i = 0; i&lt; = spaces; i ++){ sepwords [i] = malloc(3000); }
我很乐意尝试找出错误,但是通过评论或正确的类型用法,我必须清楚地了解您要尝试做什么。