0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main()
{
int a = 0, len1 = 0, len2 = 0;
int BUFSIZE = 1000;
char *string1[1];
char *string2[1];
FILE *fp1 = fopen("input1.txt", "r");
FILE *fp2 = fopen("input2.txt", "r");
if ((fp1 == 0)||(fp2 == 0))
{
    fprintf(stderr, "Error while opening");
    return 0;
}
string1[a] = (char *)malloc(BUFSIZE);
string2[a] = (char *)malloc(BUFSIZE);
fgets(string1[0], BUFSIZE, fp1);
fgets(string2[0], BUFSIZE, fp2);
len1=strlen(string1[0]);
len2=strlen(string2[0]);

printf("%c\n", string1[0][4]);
printf("Output: \n");
srand(time(NULL));
printf("%s\n", string1[0]);
printf("%s\n", string2[0]);
printf("\n");
printf("%d %d", len1, len2); 
printf("\n");

free(string1[0]);
free(string2[0]);
int x=0;
scanf("%d", &x);
fclose(fp1);
fclose(fp2);
return 0;
}

ファイルから文字列を読み取り、配列に格納する必要があります。文字列を1行だけ読み取る必要があり、配列の各要素は文字列の文字である必要があります。たとえば、「ABCDABC」を配列に読み込んだ場合、array[3]は「D」になります。しかし、私はそれを行う方法を本当に知りません。私は他の人のコードを変更して、上記のコードを取得しました。しかし、コードにポインターやアドレスを含めたくありません。それで、誰かがポインタを使わずにそれを実現する方法を教えてもらえますか?ありがとうございました!

4

2 に答える 2

2

edメモリの代わりにchar *mallocプレーンを使用することもできますchar[N]。aは関数(likjeまたは)char[N]に渡されるときに最初の要素へのポインターに自動的に変換されるため、変更はわずかです。また、プレーンforと、を使用した場合、コードは最小限にしか変更されません。ここでの主な違いは、最後のとです。fgetsstrlenchar*string1string2char *string1 = malloc(BUFSIZE);mallocfree

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

int main()
{
    int a = 0, len1 = 0, len2 = 0;
    int BUFSIZE = 1000;

    // char *string1;
    // char *string2;

    // instead of one-element arrays of char*, let's just use char arrays

    char string1[BUFSIZE];
    char string2[BUFSIZE];

    // One pointer to check whether fgets succeeded
    char *suc;

    FILE *fp1 = fopen("input1.txt", "r");
    FILE *fp2 = fopen("input2.txt", "r");
    if ((fp1 == 0)||(fp2 == 0))
    {
        fprintf(stderr, "Error while opening");
        return 0;
    }
    // No need for malloc, we have char arrays
    // string1 = (char *)malloc(BUFSIZE);
    // string2 = (char *)malloc(BUFSIZE);
    suc = fgets(string1, BUFSIZE, fp1);
    if (!suc) {
        // fgets failed, what now? exit?
        return EXIT_FAILURE;
    }
    suc = fgets(string2, BUFSIZE, fp2);
    if (!suc) {
        // see above
        return EXIT_FAILURE;
    }
    len1=strlen(string1);
    len2=strlen(string2);

    // is the read string long enough?
    if (len1 > 4) {
        printf("%c\n", string1[4]);
    }
    printf("Output: \n");
    srand(time(NULL));
    printf("%s\n", string1);
    printf("%s\n", string2);
    printf("\n");
    printf("%d %d", len1, len2); 
    printf("\n");

    // free is only for m/c/re-alloced memory
    // free(string1);
    // free(string2);
    int x=0;
    scanf("%d", &x);
    fclose(fp1);
    fclose(fp2);
    return 0;
}
于 2012-11-10T22:24:42.947 に答える
0

文字をチェックする必要がある行だけを読み取るには、次の'\n'ようにする必要があります

char *readLine(char *fileName, int line)
{
    FILE *file = fopen(fileName, "r");
    char *code;
    size_t n,l;
    int c;

    if (file == NULL)
        return NULL; //could not open file

    code = malloc(1000);

    for(l = 0; l <= line; l++)
    {
        n = 0;
        while (c = fgetc(file)) != '\n')
        {
            code[n++] = (char) c;
        }
    }

    // don't forget to terminate with the null character
    code[n] = '\0';        

    return code;
}

このコードは、改行文字がx回見つかるまで、ファイルを1文字ずつ読み取るドキュメントのx行の文字列を取得します。char *string1 = readLine("C:\document.txt",1); 2行目"Sometext"string[3] == 'e'

于 2012-11-10T22:23:48.140 に答える