使用strlen时出现分段错误

时间:2013-01-19 18:54:08

标签: c arrays segmentation-fault

过去两天我一直在研究这个问题,但似乎无法弄清楚问题。

我正在读取文件并将其作为字符串保存到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");
}
}

2 个答案:

答案 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';