Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在'中编程;C';:如何清除下一个字符串的字符数组_C_Arrays - Fatal编程技术网

在'中编程;C';:如何清除下一个字符串的字符数组

在'中编程;C';:如何清除下一个字符串的字符数组,c,arrays,C,Arrays,我试着写一段代码,可以按照特定的顺序读取文本文件。 问题是字符串覆盖了数组中的最后一个字符串,但我希望为下一个字符串清除数组,但是我不知道如何执行此操作 以下是文本文件: @str_hello_world_test={hello world!test} @str_hello_world={hello world} 输出结果如下: symbol:str_hello_world_test²` string:hello world!testtest²` hello world!testtest²`

我试着写一段代码,可以按照特定的顺序读取文本文件。 问题是字符串覆盖了数组中的最后一个字符串,但我希望为下一个字符串清除数组,但是我不知道如何执行此操作

以下是文本文件:

@str_hello_world_test={hello world!test}
@str_hello_world={hello world}
输出结果如下:

symbol:str_hello_world_test²`
string:hello world!testtest²`

hello world!testtest²`
symbol:str_hello_worldttest²`
string:hello worldorldttest²`

hello worldorldttest²`
我的代码是:

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

#define MAXBUF 255

//prototypes
void readingFile(FILE* fp);
char* readingSymbol(FILE* fp);
char* readingString(FILE* fp);

int main(void)
{
    FILE* fp;
    char directory[MAXBUF];

    puts("Geben sie ein Verzeichnis ein: ");
    gets(directory);
    fp = fopen(directory, "r");

    readingFile(fp);

    system("pause");
    return EXIT_SUCCESS;

}

void readingFile(FILE* fp){
    int c;

    while((c = fgetc(fp)) != EOF){
        char* symbol = readingSymbol(fp);
        char* string = readingString(fp);
        printf("%s\n", symbol);
    }
    return;
}

char* readingSymbol(FILE* fp){
    int c;
    int i = 0;
    char symbol[MAXBUF];

    while((c = fgetc(fp)) != '='){
        if(c == '@'){
            continue;
        }
        else{
            symbol[i] = (char)c;
            i++;
        }
    }
    printf("symbol:%s\n", symbol);
    return symbol;
}

char* readingString(FILE* fp){
    int c;
    int i = 0;
    char str[MAXBUF];

    while((c = fgetc(fp)) != '}'){
        if(c == '='){
            continue;
        }
        else if(c == '{'){
            continue;
        }
        else{
            str[i] = (char)c;
            i++;
        }
    }
    printf("string:%s\n\n", str);
    return str;
}
#包括
#包括
#定义MAXBUF 255
//原型
无效读取文件(文件*fp);
char*readingSymbol(文件*fp);
char*readingString(文件*fp);
内部主(空)
{
文件*fp;
char目录[MAXBUF];
看跌期权(“Geben sie ein Verzeichnis ein:”);
获取(目录);
fp=fopen(目录,“r”);
读取文件(fp);
系统(“暂停”);
返回退出成功;
}
无效读取文件(文件*fp){
INTC;
而((c=fgetc(fp))!=EOF){
字符*符号=读取符号(fp);
char*string=readingString(fp);
printf(“%s\n”,符号);
}
返回;
}
char*readingSymbol(文件*fp){
INTC;
int i=0;
字符符号[MAXBUF];
而((c=fgetc(fp))!='='='){
如果(c=='@'){
继续;
}
否则{
符号[i]=(字符)c;
i++;
}
}
printf(“符号:%s\n”,符号);
返回符号;
}
char*readingString(文件*fp){
INTC;
int i=0;
char-str[MAXBUF];
而((c=fgetc(fp))!='}'){
如果(c=='='='){
继续;
}
else如果(c=='{'){
继续;
}
否则{
str[i]=(char)c;
i++;
}
}
printf(“字符串:%s\n\n”,str);
返回str;
}

您的代码有一个明显的未定义行为示例。您返回悬挂的引用。将警告级别尽可能调高。然后注意这些警告。对于发生这种情况的原因,一个粗略的(依赖于实现的)合理解释是,这两个函数具有完全相同的堆栈框架布局。因此,当您调用第二个字符串时,它会用另一个字符串填充完全相同的位置

一个即时修复方法是避免返回指向缓冲区的指针,并将指向缓冲区的指针传递到函数中。然后负责填写:

char symbol[MAXBUF];
readingSymbol(fp, MAXBUF, symbol);

// ...

void readingSymbol(FILE* fp, size_t const buff_len, char symbol[buff_len]) {
    int c;
    int i = 0;

    while((c = fgetc(fp)) != '='){
        if(c == '@'){
            continue;
        }
        else{
            symbol[i] = (char)c;
            i++;
        }
    }
    printf("symbol:%s\n", symbol);
}
以上是有效的C99。如果出于某种原因在C89中编译,或者编译器不支持可变长度数组,请将函数签名更改为以下内容:

void readingSymbol(FILE* fp, size_t const buff_len, char *symbol)