1

私はCが初めてで、現在文字列の部分文字列を取得しようとしています。最終的な目標は、一連の数字、つまり 6218 を含む文字列があり、部分文字列を取得し続けるため、最後の数字を削除することです。

6218
621
62
6

現時点では、必要な長さをハードコーディングしているため、最初は 4 の部分文字列を実行しており、結果はまだ 6218 であると予想しています。ただし、gdb で出力すると 62 になります。

以下は私が使用しているコードです。

char * performSearch(char * phoneNumber, int totalLookupNumberCount, numberLookupStruct *numberLookup, int maxCharsToLookup)
{
     int i;
    for (i = strlen(phoneNumber); i < maxCharsToLookup; i--)
    {
        char searchNumber[i+1];
        strncpy(searchNumber, phoneNumber, 4);
        searchNumber[i+1] = '\0';
    }
}

関数は次のように呼び出されます。

char * displayName = performSearch(phoneNumber, totalLookupNumberCount, numberLookup, maxCharsToLookup);

私は GDB のコードをステップ実行しているので、最初に行うことは、strncpy の後に searchNumber を出力することです。したがって、ループは実際には使用されません。

渡された変数と strlen が返すものとその正しいことを確認しました

したがって、上記のコードでは、searchNumber が 6218 のままであることを期待していますが、62 を出力しています。また、phoneNumber が char * として関数に渡されることに注意してください。

ご協力いただきありがとうございます。

4

2 に答える 2

1

やるだけ

string[i]=0;

これにより、指定されたポイントの直後に文字列終了文字が配置され、残りの文字列が切り取られます。

于 2013-06-20T15:54:28.780 に答える
1

forテスト条件が間違っているようです:

for (i = strlen(phoneNumber); i < maxCharsToLookup; i--)

maxCharsToLookupが よりも大きい場合、このループは負strlen(phoneNumber)になると何かおかしなことをするように見えます。が より小さいか等しい場合i、ループは開始されません。おそらく、次のようなものが必要です。maxCharsToLookupstrlen(phoneNumber)

for (count = 0, i = strlen(phoneNumber);
     count < maxCharsToLookup && i > 0;
     ++count, --i)

strncpy()使いにくいです。ソース文字列の文字列の長さが指定されたコピーの長さよりも短い場合にのみ、宛先文字列を NUL で終了します。これは覚えにくいルールです。さらに、最後のパラメーターに書き込むように指定したバイト数を常に書き込みます。あなたのコードで:

    char searchNumber[i+1];
    strncpy(searchNumber, phoneNumber, 4);
    searchNumber[i+1] = '\0';

iが 3 未満の場合strncpy()、バッファがオーバーランします。これにより、未定義の動作が発生します。次に、バッファの後のバイトを NUL に設定しますが、これも未定義です。代わりに次のようにする必要があります。

    char searchNumber[i+1];
    strncpy(searchNumber, phoneNumber, i);
    searchNumber[i] = '\0';

を使用することを好みますsnprintf()。結果の文字列は常に NUL で終了します。

#include <stdio.h>
#include <string.h>
int main () {
    char phoneNumber[] = "6218";
    for (int i = strlen(phoneNumber); i > 0; --i) {
        char searchNumber[i+1];
        snprintf(searchNumber, sizeof(searchNumber), "%s", phoneNumber);
        puts(searchNumber);
    }
    return 0;
}
于 2013-06-20T16:16:16.837 に答える