如何在C中向后打印一个单词

时间:2013-01-24 09:24:31

标签: c

我虽然设置了一个名副其实的len strlen()函数来查找最后一个字符,然后将其打印,然后将其递减1.它在我的代码中不起作用:

#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

11 个答案:

答案 0 :(得分:5)

C数组从零开始索引。

考虑一下它如何影响字符串长度与最后一个字符的索引之间的关系。

另外,你在单词中阅读的方式很奇怪,它应该只是:

scanf("%s", wordToPrint);

或者,更好:

fgets(wordToPrint, sizeof wordToPrint, stdin);

不需要一次循环和读取一个角色。以上将根据输入量给出不同的长度。

第二个建议不会停留在空白处,所以如果你这样做,你可能应该用word取代line以便清楚。

答案 1 :(得分:2)

反向迭代需要偏移一个:

转发

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的数组具有有效索引in the range [0, N)

答案 2 :(得分:2)

查看以下代码:

end = strlen(wordToPrint) - 1;
for (x = end; x >= 0; --x) {
    printf("%c", wordToPrint[x]);
}

答案 3 :(得分:2)

除了其他海报所说的,你应该考虑给字符串提供额外的字节:

char wordToPrint[SIZE + 1];

然后设置

wordToPrint[4] = '\0';

如果有人输入一个4个字母的单词(例如&#39; blue&#39;),那么您的字符串将显示为{&#39; b&#39;,&#39; l&#39;,& #39;你&#39;&#39; e&#39;但是没有留空字符的空间。

Strlen和其他函数依赖于在最后找到一个空值。

答案 4 :(得分:1)

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

return 0;

假设你有单词otto int len = strlen(wordToPrint);会将len设置为4,但是当您在printf("%c", wordToPrint[len]);中使用它时,您的数组将超出绑定wordToPrint[4],其中数组中的最后一个索引为{{1}因为它从0索引开始

答案 5 :(得分:1)

写这样的代码是因为在wordToPrint [len],len是+1然后是wordToPrint []数组的最后一个索引,所以它显示了garbadge / 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;
}

答案 6 :(得分: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个单词并按回车键,请按回车键,希望你喜欢它并理解它

答案 7 :(得分: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 ]);

答案 8 :(得分:0)

除了其他答案之外,为什么在知道单词有SIZE字符时使用strlen()?

答案 9 :(得分: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()始终是一个好习惯。

答案 10 :(得分:0)

律&#39;为了好玩而破解:)

#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;
}

当然,这不会像预期的那样在&#34;现代&#34;系统,实现行缓冲控制台,而不是允许用户一次手动读取一个字符(虽然它可以使用特定于平台的API实现。)