0

独自の文字列関数を作成しようとしていますが、この時点で立ち往生しているようです。以下は、文字列を作成して印刷し、サイズを返すためにこれまでに持っているものです。しかし、char だけでなく char の文字列へのポインターが渡される関数を作成する必要があり、文字列内のその char の出現回数を返します。この関数から関数 make_string を呼び出そうとしていますが、機能させることができません。.h ファイルには、関数が事前にリストされているだけです。これについての助けをいただければ幸いです。ありがとう!

#include "readLineUtilities.h"

int make_string(char **line)
{
char *a,b;
int i,size=0;
a = (char *) malloc(sizeof(char));
b = getchar();
while( b != '\n' && size < MAX)
{       
    *(a+size) = b;  //remember at this point size = 0
    size++;
    b = getchar();
    a = realloc(a,size+1);
}
*(a+size) = '\0';  //end of string marker so no need to return the size directly
*line = a;
return size;    

}

int char_in_string (char *line, char c) {

make_string(*line);

}

void print_string(char *line, int size){
char *a;
int i;
a = line;
for (i=0;i<size;i++)
    printf("%c",*(a+i)); //no end of line
printf("\n");
}


int length_string(char *line){
int size = 0;
char *c,b;
c = line;
if ( c == NULL){ 
    printf("line is null\n");
    return size;
}
while (*(c + size) != '\0'){
    size++;
}
return size;
}
4

2 に答える 2

1

次のようなものが機能します。

int char_in_string (char *line, char c) {

    int len = make_string(&line);
    int i, cnt = 0;
    for ( i = 0; i < len; ++i )
    {
        if ( line[i] == c ) ++cnt;
    }
    return cnt;

}
于 2013-02-19T03:06:48.263 に答える
1

このコードに示されている一連のエラーを見ると、このコードを使用するプログラムが期待どおりに機能しない理由が簡単にわかります。

a = (char *) malloc(sizeof(char));// sizeof (char) は常に1 です。これは、sizeof (type) が type の文字数を示しているためです。malloc はどの型を返しますか? にキャストvoid *する必要はありませんchar *。その変換は C によって暗黙的に提供されるためa = malloc(1);です#include <stdlib.h>

b = getchar();// getchar が返す型は? b の型は何ですか? これらのタイプは同じである必要がありますが、あなたの例ではそうではありません。getchar は int を返します。これは、成功すると unsigned char 値になります。失敗すると、getchar は負の値を返します。これは、成功した値とは異なります。getchar() の戻り値を int に格納し、それが正であることを確認してから続行することをお勧めします。そうしないと、getchar() が '\n' 値とは異なるエラーを返したときに、プログラムがハングしてリソースを浪費しているように見える場合があります。

a = realloc(a,size+1);// realloc が NULL を返したらどうなる? あなたのプログラムは古い割り当てをリークします。戻り値を achar *tempに代入し、a を上書きする前に成功を確認することをお勧めします。これを修正しないと、プログラムでセグメンテーション違反が発生することがあります。

int char_in_string (char *line, char c) { make_string(*line); }//returnステートメントはどこにありますか? make_string は を想定してchar **いますが、式*lineは に評価されcharます。ラインの種類は?&line はどうですか? これを使用すると、間違いなく segfault が発生します。

文字列の末尾を決定するために、make_string の文字列の末尾に「\0」を配置していると思います。print_string 実装の '\0' で停止することをお勧めします。初期化されていない値を使用しようとすると、未定義の動作が発生し、プログラムがクラッシュする可能性があります。

于 2013-02-19T03:50:55.573 に答える