反转char数组

时间:2016-02-24 15:49:49

标签: c++ arrays char strncpy

当我打印出text2时,我发现它绝对不是我给它的字符串的反面而且我不确定为什么会这样。当我进入“测试”时,我会得到像“ȍ\ 2200+”这样的东西。我可以在char数组上使用strncpy吗?也许它需要用循环来完成 - 不确定。任何帮助,将不胜感激。 :)

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    char text[79], text2[79];
    bool input = true;

    while (input) {
        cout << "Please give me a line of text to examine: ";
        cin.getline(text, 79);

        for(int i = 0; i < strlen(text); i++ )
            cout << text[i];

        // test to see if it is a palindrome
        strncpy(text, text2, 80);

        reverse(text2, text2 + strlen(text2));

        printf("%s", text2);  `// when I print this out I get something odd`

        if (strcmp(text, text2) == 0)
            cout << " is a palindrome!" << endl;
        else
            cout << " is not a palindrome." << endl;

        if (strcmp(text, "END") == 0)
            input = false;
         else
            cout << "\ntype END to exit the program" << endl;

    } // end while loop
} // end main

3 个答案:

答案 0 :(得分:2)

您似乎以错误的方式使用strncpy:您可能希望将text复制到text2,而不是相反。

有一种更简单的方法来测试字符串是否是回文,即:

bool is_palindrome(const char* s, size_t n) {
  size_t i, j;

  i = 0, j = n-1;
  while (i < j && s[i++] == s[j--])
    ;
  return i >= j;
}

答案 1 :(得分:1)

为什么不使用std::vector<char>中的std::reverse<algorithm>来处理您的问题?

我会做类似下面的事情:
(请注意,我正在使用基于C ++ 11范围的for循环和auto,您可以将其更改为常规for循环并使用{{1如果你没有支持这个的编译器。)

std::string line

答案 2 :(得分:0)

通常,您会看到char*的这种逆转技术:

void reverse(char* s) {
    if(!s) return;
    size_t n = strlen(s);
    for(size_t i = 0; i < n/2; ++i) {
      char tmp = s[i];
      s[i] = s[n - i - 1];
      s[n - i - 1] = tmp;
    }
}

但是,对于非ASCII字符,这不起作用。原因是非ASCII字符需要多个字节来表示。

您需要使用wide characters来处理多字节代码点,但逻辑应该如上所示。