3

過去2日間これに取り組んできましたが、問題を理解できないようです。

ファイルから読み取り、文字配列に文字列として保存していますが、文字strlen()列を使用しようとすると、セグメンテーション違反でクラッシュします。

これが私がやっていることです。

char read_string[25];
fscanf(file, "%s", &read_string);
int length = strlen(read_string);

別の問題は、の内容を別の char 配列にコピーするread_stringと、最後にランダムな文字が追加されることです。

これが私がやっていることです

char input[25];
for(i=0; i<25; i++)
{
    if (read_string[i] == '.')
        break;
    else
        input[i] = read_string[i];
}

ピリオドが文字列として入力配列に読み込まれる前に、すべてをコピーする必要があります。

PSfscanf()ファイルが適切に構造化されているため、使用しています。

必要に応じて、ここに私のコードがあります。

#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");
}
}
4

2 に答える 2

4

ファイルから読み取り、文字配列に文字列として保存していますが、文字列で stelen を使用しようとすると、セグメンテーション違反でクラッシュします。

read_stringinのアドレスを取得する必要はありません。これは、既にポインターに減衰するfscanfためです。read_stringとにかく、&read_string == read_string配列の場合(型を除く)、セグメンテーション違反が発生しないはずです。

したがって、問題は他の場所から発生します。特に、ファイル内の行が 25 文字を超えていないことを確認してください。

もう 1 つの問題は、read_string の内容を別の char 配列にコピーすると、最後にラドム文字が追加されることです。

'\0'文字列の最後にa を追加することを忘れないでください。

input[i] = '\0';
于 2013-01-19T18:55:31.480 に答える
0

試す

fscanf(file, "%24s", read_string);

クラッシュが再現されない場合は、ファイルに 24 文字を超える行が含まれていることを意味します。この場合、この問題を回避するためにバッファを大きくすることができます

編集:

input[i] = '\0';forループの後に追加してみてください

for(i=0; i<25; i++)
{
    if (read_string[i] == '.')
        break;
    else
        input[i] = read_string[i];
}
input[i] = '\0';
于 2013-01-19T19:16:29.037 に答える