在'中编程;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)