C-字符串数组中单词的相反顺序

时间:2018-12-10 17:10:01

标签: c arrays string reverse

我做了这个程序来反转给定字符串中单词的顺序。 (而且有效)

即输出:sentence first the is This

但是,在将另一个句子添加到数组时,我陷入了困境。 例如,我需要一个数组{"This is the first sentence", "And this is the second"}作为输出生成:sentence first the is This , second the is this And

int main() {

    char str[] = {"This is the first sentence"};
    int length = strlen(str);

    // Traverse string from end
    int i;
    for (i = length - 1; i >= 0; i--) {
        if (str[i] == ' ') {

    // putting the NULL character at the position of space characters for 
    next iteration.
        str[i] = '\0';

        // Start from next character
        printf("%s ", &(str[i]) + 1);
        }
}

    // printing the last word
    printf("%s", str);

    return 0;
}

我是C的新手,所以即使解决方案很简单,我也被卡住了并不奇怪。任何帮助,将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:1)

由于您已经具有以相反顺序打印一个字符串的单词的代码,因此建议您将 function 设为一个以单个字符串作为参数的字符串,即:

void print_words_reverse(char * const str) {
    // your current code here
}

然后您可以为每个字符串分别调用它:

char strings[][30] = {
    "This is the first sentence",
    "And this is the second"
};
for (int i = 0; i < sizeof(strings) / sizeof(*strings); ++i) {
    print_words_reverse(strings[i]);
}

请注意,由于您正在修改字符串(通过使用NUL字节替换空格),因此该参数需要可修改,这意味着您(在标准C语言中)不允许使用指向字符串文字的指针来调用它,表示您不能简单地使用const char *strings[] = { "first", "second" }。通过使代码不修改参数字符串,可以摆脱为每个字符串保留的难看的常量长度(此处为30)。或者,您可以为每个句子使用一个单独的char数组,然后使用指向那些(可修改的)字符串的指针。

答案 1 :(得分:1)

首先,您可以尝试使用二维数组或使用指针数组。

第二,在您的方法中,您丢失了字符串的初始值,我不知道它的重要性。

这是我快速使用指针的方法。

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

static void print_word(const char *str)
{
    for (int i = 0; str[i] && str[i] != ' '; i++)
        printf("%c", str[i]);
    putchar(' ');
}

int main(void)
{
    int len;
    const char *str[] = {"This is the first sentence",
                         "And this is second", NULL};

    for (int i = 0; str[i]; i++) { 
        for (len = strlen(str[i]); len >= 0; len--) {
            if (len == 0)
                print_word(&str[i][len]);
            else if (str[i][len] == ' ') 
                print_word(&str[i][len + 1]);
        }
        putchar('\n');
    }

    printf("Initial value of array of strings [%s | %s] \n", str[0], str[1]);
    return 0;
}

输出为:

  

首先句子是

     

这是第二个

     

字符串数组的初始值[这是第一句话|这是第二个]

答案 2 :(得分:0)

我建议您使用memcpy,但不要过多修改您的代码,这似乎可以解决问题

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

#define MAX_STRING_LENGTH 100

int main()
{
    char *str[] = {"This is the first", "And this is the second sentence"};
    const size_t NUM_STRING = sizeof(str)/sizeof(char*);
    /*%z used to print size_t variables*/
    printf("%zd strings found\n", NUM_STRING);
    int length[2];
    int i;
    for (i=0; i<NUM_STRING; i++)
    {
        length[i] = strlen(str[i]);
    }
    printf("length initialized %d %d\n", length[0], length[1]);

    // Traverse string from end
    int j = 0;
    char temp[MAX_STRING_LENGTH];
    printf("\n\n");
    for (j=0; j<NUM_STRING; j++)
    {
      /*Make sure the string respect the MAX_STRING_LENGTH limit*/
      if (strlen(str[j])>MAX_STRING_LENGTH)
      {
        printf("ERROR: string %d exceding max string length %d defined in constant "
        "MAX_STRING_LENGTH. Exiting from program.\n", j, MAX_STRING_LENGTH);
        exit(1);
      }
      //reset temporary string
      memset(temp, '\0', sizeof(temp));
      //printf("temp variable reinitialized\n");
      for (i = length[j] - 1; i >= 0; i--)
      {
        temp[i] = str[j][i];
        if (str[j][i] == ' ')
        {
          // putting the NULL character at the position of space characters for  next iteration.
          temp[i] = '\0';
          // Start from next character
          printf("%s ", &(temp[i]) + 1);
        }
      }

      // printing the last word
      printf("%s ", temp);
    }
    printf("\n");


    return 0;
}