1

最後の文字を見つけて印刷し、 1ずつ減らす関数を使用して真lenの関数を設定しましたが、私のコードでは機能していません:strlen()

#include <stdio.h>
#include <string.h>
#define SIZE 4
int main(void)

{
    int index;
    char wordToPrint[SIZE];
    printf("please enter a random word:\n");
    for (index = 0; index < SIZE; index++)
    {
        scanf("%c", &wordToPrint[index]);
    }

    int len = strlen(wordToPrint);
    for (index = 0; index < SIZE; index++)
    {
        printf("%c", wordToPrint[len]);
        --len;
    }

    return 0;
}

入力は「nir」

出力は次のとおりです。

??
r

最後のブロックで何が問題になっていますか?

tnx

4

11 に答える 11

5

C 配列のインデックスは 0 から始まります。

これが、文字列の長さと最後の文字のインデックスとの関係にどのように影響するかを考えてみてください。

また、単語の読み方は非常に奇妙です。次のようにする必要があります。

scanf("%s", wordToPrint);

または、より良い:

fgets(wordToPrint, sizeof wordToPrint, stdin);

一度に 1 文字ずつループして読み取る必要はありません。上記は、入力量に応じて異なる長さを提供します。

ただし、2 番目の提案は空白で終わらないため、それを使用する場合は、明確にwordするためにおそらく に置き換える必要があります。line

于 2013-01-24T09:25:36.393 に答える
2

逆反復は 1 オフセットする必要があります。

進む:

for (size_t i = 0; i != N; ++i) { putchar(word[i]); }

後方:

for (size_t i = 0; i != N; ++i) { putchar(word[N - i - 1]); }
//                                                  ^^^^

これは、長さの配列が範囲内にN有効なインデックスを持っているためです。[0, N)

于 2013-01-24T09:28:35.960 に答える
2

次のコードを見てください。

end = strlen(wordToPrint) - 1;
for (x = end; x >= 0; --x) {
    printf("%c", wordToPrint[x]);
}
于 2013-01-24T09:29:22.807 に答える
2

他のポスターが言っていることに加えて、文字列に追加のバイトを与えることを検討する必要があります。

char wordToPrint[SIZE + 1];

そして設定

wordToPrint[4] = '\0';

誰かが 4 文字の単語 (「blue」など) を入力した場合、文字列は { 'b', 'l', 'u', 'e' } のようになりますが、null 文字を入れる余地はありません。

Strlen およびその他の関数は、最後に null 値を見つけることに依存しています。

于 2013-01-24T09:35:17.827 に答える
1
int len = strlen(wordToPrint);
for (index = 0; index < SIZE; index++)
{
    printf("%c", wordToPrint[len]);
    --len;
}

return 0;

ottoという単語があると仮定すると 、4に int len = strlen(wordToPrint);設定されますが、配列 でそれを使用すると、配列の最後のインデックスが0インデックスから始まるため、範囲外になりますlenprintf("%c", wordToPrint[len]);wordToPrint[4]wordToPrint[3]

于 2013-01-24T09:30:57.257 に答える
1

これはあなたの質問に対するプログラム全体です。

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

char *strrev(char *); // Prototype

/* The following function is by me, to reverse a string, because strrev is not available in GCC */

char *strrev(char *str)
{
      char *p1, *p2;

      if (! str || ! *str)
            return str;
      for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
      {
            *p1 ^= *p2;
            *p2 ^= *p1;
            *p1 ^= *p2;
      }
      return str;
}

/*================================================================Begin Main======================================================================================*/

int main()
{
    char sentence[100], rev_sentence[100], c;

    int j = 0, i = 0, m = 0;

    sentence[i] = ' ';                 // The first char in the sentence should be a space to reverse this first word
    i++;
    printf("Enter a sentence : ");
    while((c = getchar()) != '\n')
    {
        sentence[i] = c;
        i++;
    }
    sentence[i] = '\0';


    printf("Reversed word is: ");


    for(i = strlen(sentence) - 1 ; i >= 0; i = i - 1)
    {
         if(sentence[i] == ' ')
        {
            rev_sentence[j] = '\0'; // because strrev fun reverses string ntil it encounters a first \0 character
            strrev(rev_sentence);
            printf("%s ", rev_sentence);
            for(m = 0; m < 100; m++)
            rev_sentence[m] = 0;
            j = 0;
            continue;
        }
        rev_sentence[j] = sentence[i];
        j++;
    }

    rev_sentence[j] = '\0';

}

このプログラムは、文全体を逆にするか、単語を 1 つだけ入力して Enter キーを押すと単語を反転します。気に入って理解してください

于 2013-01-24T11:20:47.867 に答える
1

wordToPrint[len] では、len が +1 で、wordToPrint[] 配列の最後のインデックスであるため、このようにコードを記述します。したがって、ガバッジ/null 値が表示されます。

#include <stdio.h>
#include <string.h>
#define SIZE 4
int main(void)

{
    int index;
    char wordToPrint[SIZE];
    printf("please enter a random word:\n");
    for (index = 0; index < SIZE; index++)
    {
        scanf("%c", &wordToPrint[index]);
    }

    int len = strlen(wordToPrint);
    for (index = 0; index < SIZE; index++)
    {
        --len;
        printf("%c", wordToPrint[len-1]);
    }

    return 0;
}
于 2013-01-24T10:36:53.743 に答える
0

投稿されたものに基づいた作業コードは次のとおりです。

#include <stdio.h>
#include <string.h>
#define SIZE 4
int main(void)

{
int index;
char wordToPrint[SIZE];
printf("please enter a random word:\n");
//Why you need a loop to read a word?
//for (index = 0; index < SIZE; index++)
//{
//    scanf("%c", &wordToPrint[index]);
//}

scanf("%s",wordToPrint);

int len = strlen(wordToPrint);

//Modify the loop like this:
for (index = len; index >= 0 ; index--)
{
    printf("%c", wordToPrint[len]);  
}
printf("\n");//Add this line for clearing the stdout buffer and a more readable output.
return 0;
}

注:配列を使用する前に、配列をmemset()またはbzero()することをお勧めします。

于 2013-01-24T10:14:21.147 に答える
0

他の回答に加えて、単語に SIZE 文字があることがわかっているのに、なぜ strlen() を使用するのですか?

于 2013-01-24T09:31:08.903 に答える
0

このコードは間違っています:

int len = strlen(wordToPrint);
for (index = 0; index < SIZE; index++)
{
    printf("%c", wordToPrint[len]);
    --len;
}

4 から 1 までの文字を印刷しますが、3 から 0 までの文字を印刷したいとします。

このようにする必要があります:

for (index = len - 1; index >= 0; index--)
    printf("%c", wordToPrint[index ]);
于 2013-01-24T09:28:47.443 に答える
0

楽しいハック:)

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

#define LENGTH 32

int main(void)
{
  // allocate a zero-filled buffer of LENGTH bytes
  // we add LENGTH so that we start writing right *after* the buffer
  char *word = LENGTH + calloc(LENGTH, 1);

  // 0xFF will limit our buffer so that we do not write out of bounds
  *(word - LENGTH) = 0xFF;

  // order is important: we are decrementing the pointer and **then**
  // reading a character from the standard input, we compare it to the
  // line feed character so that we stop reading characters when return
  // key is pressed
  while ((*--word = fgetc(stdin)) != '\n' && *word != 0xFF);
  printf("The word is: %s", word);

  // tidy up!
  free(word);
  return 0;
}

もちろん、これは、ユーザーが一度に 1 文字ずつ手動で読み取れるようにするのではなく、ライン バッファー コンソールを実装する「最新の」システムでは期待どおりに機能しません (ただし、プラットフォーム固有の API を使用して実装することはできます)。

于 2018-02-15T23:06:48.963 に答える