过去两天我一直在研究这个问题,但似乎无法弄清楚问题。
我正在读取文件并将其作为字符串保存到char数组中但是当我尝试在字符串上使用strlen()
时,它会因分段错误而崩溃。
这就是我正在做的事情。
char read_string[25];
fscanf(file, "%s", &read_string);
int length = strlen(read_string);
另一个问题是当我将read_string
的内容复制到另一个char数组中时,它会在最后添加随机字符。
这就是我正在做的事情
char input[25];
for(i=0; i<25; i++)
{
if (read_string[i] == '.')
break;
else
input[i] = read_string[i];
}
我需要在读取字符串到输入数组之前复制所有内容。
P.S。我正在使用fscanf()
因为文件结构良好。
如果需要,这是我的代码。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
//variables
FILE *rFile;
int num_states; //number of states
int num_alphabet; //number of alphabets
int num_acstates; //number of accepting states
int ac_state; //the accepting state
char alphabet[num_alphabet]; //alphabet
char read_string[25]; //assuming the input will be maximum of 25 character
char input[25];
int i,j,x; //indexes for the loop
//open the file to read
rFile = fopen("dfa11", "r");
if (rFile != NULL)
{
//do the program here
//read number of states and number of alphabets
fscanf(rFile, "%d %d", &num_states, &num_alphabet);
//read the alphabet
fscanf(rFile, "%s", &alphabet);
//read the state transition table (matrix)
int value = num_states*num_alphabet;
char table[num_states][num_alphabet];
for(i=0; i<num_states; i++)
{
for(j=0; j<num_alphabet; j++)
{
fscanf(rFile, "%d", &table[i][j]);
}
}
//read number of accepting states and accepting state
fscanf(rFile, "%d", &num_acstates);
fscanf(rFile, "%d", &ac_state);
//read the input string from the file
fscanf(rFile, "%s", &read_string);
for(i=0; i<25; i++)
{
if (read_string[i] == '.')
break;
else
input[i] = read_string[i];
}
//strncpy(input, read_string, j);
printf("%d\n", strlen(read_string));
printf("%d\n", strlen(input));
printf("%s\n", read_string);
printf("%s\n", input);
//close the file
fclose(rFile);
}
else
{
printf("File could not be found");
}
}
答案 0 :(得分:4)
我从文件中读取并将其作为字符串保存到char数组中,但是当我尝试在字符串上使用stelen时,它会因分段错误而崩溃。
您不需要在read_string
中使用fscanf
的地址,因为read_string
已经衰减到指针。无论如何,因为&read_string == read_string
在数组的情况下(类型除外),它不应该导致分段错误。
因此问题来自其他地方。其中,检查文件中的行是否不超过25个字符。
另一个问题是当我将read_string的内容复制到另一个char数组时,它会在最后添加radom字符。
不要忘记在字符串的末尾添加'\0'
。
input[i] = '\0';
答案 1 :(得分:0)
尝试
fscanf(file, "%24s", read_string);
如果您的崩溃不再被复制,则表示您的文件包含超过24个字符的行。在这种情况下,你可以让你的缓冲区更大,以避免这个问题
修改强> 的
尝试在for循环后添加input[i] = '\0';
for(i=0; i<25; i++)
{
if (read_string[i] == '.')
break;
else
input[i] = read_string[i];
}
input[i] = '\0';