1

我虽然设置了一个名副其实lenstrlen()函数来查找最后一个字符,打印它,然后将其减 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;
}

输入是“尼尔”

输出是:

??
r

最后一个区块有什么问题?

tnx

4

11 回答 11

5

C 数组索引从零开始。

想想这如何影响字符串长度和最后一个字符的索引之间的关系。

另外,你在这个词中的阅读方式很奇怪,应该是:

scanf("%s", wordToPrint);

或更好:

fgets(wordToPrint, sizeof wordToPrint, stdin);

无需一次循环并读取一个字符。以上将根据输入量为您提供不同的长度。

第二个建议不会停留在空白处,所以如果你这样做,你可能应该替换wordline清楚起见。

于 2013-01-24T09:25:36.393 回答
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具有有效索引。[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' } 但没有空字符的空间。

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

于 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 所以 int len = strlen(wordToPrint);将设置len为 4,但是当你在 printf("%c", wordToPrint[len]);数组中 使用它时,数组wordToPrint[4]中的最后一个索引是wordToPrint[3]从 0 索引开始的

于 2013-01-24T09:30:57.257 回答
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;
}
于 2013-01-24T10:36:53.743 回答
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';

}

这个程序反转整个句子,或者如果你只输入一个单词并按下回车键,希望你喜欢并理解它

于 2013-01-24T11:20:47.867 回答
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

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

于 2013-01-24T09:31:08.903 回答
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;
}

注意:在使用之前对数组进行 m​​emset() 或 bzero() 始终是一个好习惯。

于 2013-01-24T10:14:21.147 回答
0

Lil' hack 的乐趣 :)

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

当然,这在“现代”系统中不会像预期的那样工作,它实现了行缓冲控制台,而不是允许用户一次手动读取一个字符(尽管它可以使用特定于平台的 API 来实现。)

于 2018-02-15T23:06:48.963 回答