1

C で使用可能な文字列関数の実装のいくつかを書き出そうとしていました。私のコードは次のとおりです。

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

char *mystrcpy(char *s1, char *s2)
{
    while(*s1++ = *s2++);
    return s1;
}

int mystrlen(char *s)
{
    int len = 0;
    while(*s != '\0')
    {
        len++;
    }
    return len;
}

int main(void)
{
    char arr = "Hi";
    char arr1[10];
    char arr2[] = "Hello";
    int length;

    mystrcpy(arr1, arr2);
    printf("%s", arr1);

    length = mystrlen(arr);
    printf("%d", length);

    return 0;
}

mystrcpy正常に動作しますが、他のメソッドmystrlenは実行されません。エラーは何ですか?以下は、プログラムの終了メモです。

プロセスはステータス -1073741510 (0 分 4 秒) で終了しました

また、キャストに関する警告もほとんどありません。キャストを使用する必要があるコード内の場所はありますか?

4

2 に答える 2

3

まず、mystrlen無限ループがあります。

固定コード:

int mystrlen(const char *s)
{
    int len = 0;
    while (*s++ /* increment to next character every loop */ != '\0')
    {
        len++;
    }
    return len;
}

constによって参照されるデータを決して変更しないため、追加されました*s

次に、代入:char arr="Hi";が無効です。

char[]配列をchar変数に代入しようとしています。正しい形式は、次のいずれかになります。

char arr[]="Hi"; // array syntax
char *arr="Hi";  // pointer syntax

無効なarr割り当てを考えると、実行時エラーはmystrlendeference を誤って試みたことが原因である可能性が最も高いarrです。

どのコンパイラを使用していますか? ほとんどの準拠コンパイラは、2 番目の問題をキャッチしているはずです。GCC を使用している場合は-Wall、makefile にフラグを追加します。

于 2012-06-19T14:54:52.903 に答える
1

これ:

char arr="Hi"; /* Should have caused compiler warning,
                  as is attempting to assign a char
                  to a char[3]. */

次のようにする必要があります。

char arr[] ="Hi";

また:

char* arr = "Hi";
于 2012-06-19T14:55:03.527 に答える