3

次の C コードの while ループは、*next == NULL のときに終了しないようで、Visual Studio 2010 Express で不適切な ptr を使用して strlen(*next) を呼び出そうとします。考えられる限りのことはすべて試しましたが無駄でした。コードは、文字列の配列で最短および最長の文字列を見つけようとします。

char *stringsInArray[] = {"green mats", "cat", "sat", "on", "the", "green mat", NULL};
char *shortest, *longest, **current, **next, **end;

current = stringsInArray;
next = stringsInArray + 1;
shortest = stringsInArray[0];
longest = stringsInArray[0];

while (*next != NULL) 
{
    if (strlen(*current) < strlen(*next))
    {
        if (strlen(shortest) > strlen(*next))
            shortest = *next;
        if (strlen(*current) < strlen(shortest))
       shortest = *current;
        if (strlen(*next) > strlen(longest))
            longest = *next;
    }  
    else
    if (strlen(*current) > strlen(*next))
    {
        if (strlen(*current) > strlen(longest))
      longest = *current;
        if (strlen(*next) < strlen(shortest))
      shortest = *next;
    }
    else // strlen(*stringsInArray) == strlen(*next)
    {
        // do nothing
    }

   *current++;
   *next++;
} 

printf("shortest string: %s\n",*shortest);
printf("longest string: %s\n",*longest);
4

3 に答える 3

4

あなたは変えるべきです

*current++;
*next++;

current++;
next++;

どちらも正常にインクリメントしますが、前者はとの逆参照/戻り値もcurrentありnextます。これは必要ありません。

ただし、問題は次のとおりです。

printf("shortest string: %s\n", *shortest);
printf("longest string: %s\n",  *longest);

ここでは、文字列をフォーマットとして使用して文字を印刷しようとします。

これは機能するはずです:

printf("shortest string: %s\n", shortest);
printf("longest string: %s\n",  longest);
于 2012-04-05T19:29:12.677 に答える
0

コードは実際には期待どおりに動作します - 変更するだけです

printf("shortest string: %s\n",*shortest);
printf("longest string: %s\n",*longest);

printf("shortest string: %s\n",shortest);
printf("longest string: %s\n",longest);
于 2012-04-05T19:30:42.013 に答える
-1

%s は char へのポインタ、つまり char * を想定しています。したがって、ポインター位置の値である *shortest および *longest ではなく、ポインターである最短および最長でなければなりません

于 2015-01-24T00:07:25.970 に答える