Đảo thứ tự của chữ

Cho em hỏi là phải sửa thế nào để nó có thể in ra “gninnur si tac” ạ. Em code thế này nhưng nó chỉ in ra “gninnur” thôi. Mọi người xem giúp em, em cảm ơn ạ :smile:

#include "pch.h"
#include <iostream>
#include <math.h>
using namespace std;
char s[50];
int run = 0;
int stringLength(char* s)
{
	int i = 0;
	while (s[i] != '\0') i++;
	return i;
}
void reverseString(char* initialString)
{
	int lengthS = stringLength(initialString);
	if (run == lengthS)
	{
		cout << s;
		return;
	}
	s[run] = initialString[lengthS-1];
	initialString[lengthS - 1] = '\0';
	run++;
	return reverseString(initialString);
}

int main()
{
	char ten[] = "cat is running";
	reverseString(ten);
	return 0;
}

Thật sự thì không hiểu bạn đang làm cái gì luôn. :smile:

Đảo ngược string thì đơn giản như vầy là được rồi. :slight_smile:

#include <iostream>

void revStr(char *s) {
    int j = 0;
    while (s[j]) j++;
    j--;
    
    char tmp = 0;
    for (int i = 0; i < j; i++, j--) {
        tmp = s[i];
        s[i] = s[j];
        s[j] = tmp;
    }
}

int main() {
    char s[] = "sherly1001";
    revStr(s);
    std::cout << "String reversered: " << s << '\n';
    return 0;
}
3 Likes

Đề yêu cầu dùng recursive nên em cố nghĩ theo cách recursive ạ

Vậy sao không viết ngay từ đầu :smiley:


Bài này đệ quy kiểu

# pseudo
reverse :: String -> String
reverse "" -> ""
reverse s -> s[-1] . reverse s[1..-1] . s[0]

nhưng lại khó vì C-string không có length sẵn :smiley: sao làm.

3 Likes

Chiều theo ý bạn. :slight_smile:

#include <iostream>

void revStr(char *s, int len) {
    if (len > 1) {
        char tmp = *s;
        *s = *(s + len - 1);
        *(s + len - 1) = tmp;
        revStr(s + 1, len - 2);
    }
}

int main() {
    char s[] = "Sherly1001";
    int len = 0;
    while (s[len]) len++;
    
    revStr(s, len);
    std::cout << "String reversed: " << s << '\n';
    return 0;
}
4 Likes

C

#include <stdio.h>
#include <string.h>
int main() {
    char organic_reaction[] = "CH3COOH + C2H5OH <--> CH3CHOOC2H5 + H2O";
    for (int i = strlen(organic_reaction) - 1; i >= 0; i--) printf("%c", organic_reaction[i]);
}

C++

#include <iostream>
#include <string>
int main() {
    std::string inorg_reaction { "2Fe + 6H2SO4 --> Fe2(SO4)3 + 3SO2 + 6H2O" };
    inorg_reaction.reverse();
    std::cout << inorg_reaction << std::endl;
}
5 Likes

Em cảm ơn mọi người ạ :)))))

Ở phần này bạn làm rất tốt. mục đích là giảm quá trình lặp đi một nửa. Nhưng đang sai ở chỗ, bạn mới copy phần tử cuối về đầu mà chưa copy ngược lại.
Sửa lại chút là ngon lành:

	s[run] = initialString[lengthS-1];
	s[lengthS-1] = initialString[run];
	initialString[lengthS - 1] = '\0';
5 Likes

Mình đã hiểu rồi :smiley: cảm ơn bạn nhiều lắm.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?