C 为什么这个数组现在不能正常输出,即使它在早期的测试中工作得很好

C 为什么这个数组现在不能正常输出,即使它在早期的测试中工作得很好,c,file-io,C,File Io,我正在开发一个程序,其中包括一组代码,这些代码“假定”用于过滤字符串,以防止非字母数字字符(下划线除外)被进一步传递到程序中。当我在主程序中实现它之前对它进行测试时(如下所示),这个部分工作得很好,但是当我现在运行它时,输出只是重复了很多次,直到出现分段错误,我一辈子都无法找出是什么导致了这种情况的发生,因此,如果有人能帮我解决这个问题,我将非常感激,谢谢!另外,为了便于查看它在主程序中的实现位置,我在主代码中截取了它的位置,并对文章长度过长表示歉意 austin@Ruby:~/cprac$ .

我正在开发一个程序,其中包括一组代码,这些代码“假定”用于过滤字符串,以防止非字母数字字符(下划线除外)被进一步传递到程序中。当我在主程序中实现它之前对它进行测试时(如下所示),这个部分工作得很好,但是当我现在运行它时,输出只是重复了很多次,直到出现分段错误,我一辈子都无法找出是什么导致了这种情况的发生,因此,如果有人能帮我解决这个问题,我将非常感激,谢谢!另外,为了便于查看它在主程序中的实现位置,我在主代码中截取了它的位置,并对文章长度过长表示歉意

austin@Ruby:~/cprac$ ./words
[hel123_lo]
测试有效的代码

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

int main(void) {
    int i;
    char *p;
    char stg[] = "hel123*^_l!o";
    char output[200] = {0x00};
    int index = 0;


    p = stg;
    while( *p )
    {
    if (isalnum(*p) || *p == '_')
    {
        output[index++] = *p;
    }
    p++;
    }

printf("[%s]\n", output);
return 0;
}
#包括
#包括
#包括
内部主(空){
int i;
char*p;
char stg[]=“hel123*^ l!o”;
字符输出[200]={0x00};
int指数=0;
p=stg;
而(*p)
{
如果(isalnum(*p)| |*p=='|')
{
输出[index++]=*p;
}
p++;
}
printf(“[%s]\n”,输出);
返回0;
}
主代码

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

#ifndef max
#define max(a, b) ((a)>(b))? (a) : (b)
#endif

long GetFileSize(FILE *fp){
long fsize = 0;

fseek(fp,0,SEEK_END);
fsize = ftell(fp);
fseek(fp,0,SEEK_SET);//reset stream position!!

return fsize;
}
char *lastline(char *filepath){
FILE *fp;
char buff[4096+1];
int size,i;
long fsize;
if(NULL==(fp=fopen(filepath, "r"))){
    perror("file cannot open at lastline");
    return NULL;
}
fsize= -1L*GetFileSize(fp);
if(size=fseek(fp, max(fsize, -4096L), SEEK_END)){
    perror("cannot seek");
    exit(0);
}
size=fread(buff, sizeof(char), 4096, fp);
fclose(fp);
buff[size] = '\0';
i=size-1;
if(buff[i]=='\n'){
    buff[i] = '\0';
}
while(i >=0 && buff[i] != '\n')
    --i;
++i;
return strdup(&buff[i]);
}

int main(int argc, char *argv[], char *envp[]){
    char *last;
    char *name;
    char field_x[128];
    char field_y[128];
    char field_z[128];
    char field_world[128];
    char field_cause[128];
    char field_killer[128];
    name = getenv("MCEXEC_PLAYERNAME");
    char *filename;
    char *p;
    char *ispvp;
    // m
    int i;
    char *f;
    char output[200] = {0x00};
    int index = 0;
    filename = malloc(sizeof "/home/minecraft/freedonia/playerdata/deathlog-.txt" - 1 +     strlen(name) + 1);
    if (!filename) exit(EXIT_FAILURE);
    snprintf(filename,4096,"/home/minecraft/freedonia/playerdata/deathlog-  %s.txt",name);
    last = lastline(filename);
    if( last != NULL ) {
    printf( "%s\n", last );
    sscanf(last, "%*[^:]:%*[^:]:%*[^:]:%127[^:]:", field_x);
    sscanf(last, "%*[^:]:%*[^:]:%*[^:]:%*[^:]:%127[^:]:", field_y);
    sscanf(last, "%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%127[^:]:", field_z);
    sscanf(last, "%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%127[^:]:", field_world);
    sscanf(last, "%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%*[^:]:%127[^:]:", field_cause);
    p = strchr(field_cause, '_');
    printf( "X coord: %s\n", field_x);
    printf( "Y coord: %s\n", field_y);
    printf( "Z coord: %s\n", field_z);
    printf( "World: %s\n", field_world);
    printf( "Cause: %s\n", field_cause);
    while (p != NULL) {
    ispvp = "true";
   // printf ("found at %d\n",p - field_cause + 1);
    sscanf(field_cause, "%*[^_]_%128[^_]_", field_killer);
    printf( "%s\n", field_killer);
    f = field_cause;
    while( *f )
    {
      if (isalnum(*f) || *f == '_')
      {
        output[index++] = *f;
      }
      f++;
    }

    printf("[%s]\n", output);
 //   p = strchr(p + 1, '_');
    }

    }
//    printf("\"%s\"\n", last);
free(last);
return 0;
}
#包括
#包括
#包括
#包括
#ifndef最大值
#定义最大值(a,b)((a)>(b))?(a) :(b)
#恩迪夫
长GetFileSize(文件*fp){
长fsize=0;
fseek(fp,0,SEEK_END);
fsize=ftell(fp);
fseek(fp,0,SEEK_SET);//重置流位置!!
返回fsize;
}
char*lastline(char*filepath){
文件*fp;
字符增益[4096+1];
int大小,i;
长fsize;
if(NULL==(fp=fopen(文件路径,“r”)){
perror(“文件无法在最后一行打开”);
返回NULL;
}
fsize=-1L*GetFileSize(fp);
如果(大小=fseek(fp,max(fsize,-4096L),SEEK_END)){
佩罗尔(“无法寻求”);
出口(0);
}
大小=fread(buff,sizeof(char),4096,fp);
fclose(fp);
buff[大小]='\0';
i=尺寸-1;
如果(buff[i]='\n'){
buff[i]='\0';
}
而(i>=0&&buff[i]!='\n')
--一,;
++一,;
返回strdup(&buff[i]);
}
int main(int argc,char*argv[],char*envp[]{
字符*最后;
字符*名称;
字符字段_x[128];
字符字段_y[128];
字符字段_z[128];
char field_world[128];
字符字段_原因[128];
char field_killer[128];
name=getenv(“MCEXEC_PLAYERNAME”);
字符*文件名;
char*p;
char*isppp;
//m
int i;
char*f;
字符输出[200]={0x00};
int指数=0;
filename=malloc(sizeof)/home/minecraft/freedonia/playerdata/deathlog-.txt“-1+strlen(name)+1;
如果(!filename)退出(退出失败);
snprintf(文件名,4096,“/home/minecraft/freedonia/playerdata/deathlog-%s.txt”,名称);
last=lastline(文件名);
if(last!=NULL){
printf(“%s\n”,最后一个);
sscanf(最后一个“%*[^:::%*[^:::%*[^:::%127[^:::”,字段x);
sscanf(最后一个,“%*[^:::%*[^:::%*[^:::%*[^:::%127[^:::”,字段y);
sscanf(最后一个“%*[^:::%*[^:::%*[^:::%*[^:::%*[^:::%127[^:::”,字段z);
sscanf(最后一个,“%*[^:::%*[^:::%*[^:::%*[^:::%*[^:::%*[^::::%127[^:::”,字段世界);
sscanf(最后一个,“%*[^:::%*[^:::%*[^:::%*[^:::%*[^:::%*[^::::%127[^:::”,字段\原因);
p=strchr(字段“原因”,“原因”);
printf(“X坐标:%s\n”,字段X);
printf(“Y坐标:%s\n”,字段_Y);
printf(“Z坐标:%s\n”,字段_Z);
printf(“世界:%s\n”,字段\世界);
printf(“原因:%s\n”,字段\原因);
while(p!=NULL){
ispvp=“true”;
//printf(“发现于%d\n”,p-字段\u原因+1);
sscanf(野战原因,“%*[^[uuu2][u12[^[u2][u2],野战杀手);
printf(“%s\n”,字段);
f=场_原因;
而(*f)
{
如果(isalnum(*f)| |*f=='|')
{
输出[index++]=*f;
}
f++;
}
printf(“[%s]\n”,输出);
//p=strchr(p+1,'.');
}
}
//printf(“\%s\”\n”,最后一个);
免费(最后);
返回0;
}
p在该块中永远不会更改,因此它将始终保持不变!=空


p在该块中永远不会更改,因此它将始终保持不变!=空。

使用调试器或valgrind找出segfault所在的位置,并告诉我们。@JohnZwinck您好,谢谢您的建议,当涉及到调试时(我在debian裸体环境中进行测试和编码(尽管为了安全起见使用了不同的服务器)),您建议我使用什么调试程序,还是你在大多数人中推荐的valgrind?我对c比较陌生(几周前开始自学,作为一个暑期项目),所以我希望能得到关于这类东西的任何建议,谢谢!如果您在Linux上,请从valgrind开始进行“被动”调试,以查找内存错误;当您有segfault或某些神秘行为要跟踪,或要加载核心文件时,从gdb开始进行“主动”调试。使用调试器或valgrind找出segfault所在的位置,并告诉我们。@JohnZwinck您好,谢谢您的建议,在调试方面(我在debian裸体环境中进行测试和编码(尽管为了安全起见使用了不同的服务器)),您建议我使用什么调试程序,或者valgrind是您推荐的大多数调试程序?我对c比较陌生(几周前开始自学,作为一个暑期项目),所以我希望能得到关于这类东西的任何建议,谢谢!如果您在Linux上,请从valgrind开始进行“被动”调试,以便查找内存错误;从gdb开始进行“主动”调试,以便在您有SEGFULT或某些神秘行为要跟踪时,或从核心文件加载时进行调试。如果您说永远不会这样做!=NULL,那么代码首先是如何执行的?只是说如果p!=空,所以它必须被激活。哎呀,我把那个词搞错了。永远都是NULLoh谢谢:)我现在出去走走,但很快会尝试修复,并让你知道如果你说永远不会发生的话会发生什么!=NULL,那么代码首先是如何执行的?只是说如果p
    while (p != NULL) {
    ispvp = "true";
    // printf ("found at %d\n",p - field_cause + 1);
    sscanf(field_cause, "%*[^_]_%128[^_]_", field_killer);
    printf( "%s\n", field_killer);
    f = field_cause;
    while( *f )
    {
      if (isalnum(*f) || *f == '_')
      {
        output[index++] = *f;
      }
      f++;
    }

    printf("[%s]\n", output);
    //   p = strchr(p + 1, '_');
    }