Member 14103987 Ответов: 2

Как заменить карактер в строке?


Поэтому я хочу заменить символ, который выбирает пользователь, а затем выбрать, какой символ следует использовать вместо него. Это первый раз, когда я делаю что-то подобное, и все это ново для меня, так что если у кого-то есть хорошая идея, как это сделать, я буду благодарен. это длинный код, но то, о чем я говорю, в основном начинается с "if(x == 6)"

Что я уже пробовал:

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

int main()
{
	int x;

	printf("Pick the program that should be executed:\n");
	printf(" 1. Split text\n 2. Upper case to lower case\n 3. Lower case to upper case\n 4. Remove a character\n 5. Add a character\n 6. Replace a character\n 7. Statistics\n 8. Exit\n Enter an option:\n");
	scanf("%d", &x);

	if (x == 1)    ///split the text 
	{
		char str[100];
		int i;

		printf("Write the text that should be used:\n");
		getchar();
		fgets(str, 100, stdin);

		printf("Input was: %s\n", str);

		for (i = 0; str[i] != '\0'; i++)
		{
			printf("%c", str[i]);
			printf("\n");
		}
	}

	if (x == 2)   //upper case to lower case
	{
		char str[100];
		int i;

		printf("Write the text that should turn upper cases to lower cases: \n");
		getchar();
		fgets(str, 100, stdin);

		printf("Input was: %s\n", str);

		for (i = 0; str[i] != '\0'; i++)
			if (str[i] >= 'A' && str[i] <= 'Z')
				str[i] = str[i] + 32;     //A - Z = 65 - 90, a - z = 97 - 122

		printf("string converted to lower case: %s", str);

		getchar();

	}

	if (x == 3)  //lower case to upper case
	{
		char str[100];
		int i;

		printf("Write the text that should turn lower cases to upper cases\n");
		getchar();
		fgets(str, 100, stdin);

		printf("Input was: %s\n", str);

		for (i = 0; str[i] != '\0'; i++)
			if (str[i] >= 'a' && str[i] <= 'z')
				str[i] = str[i] - 32;

		printf("string converted to upper case: %s\n", str);

		getchar();
	}

	if (x == 4)
	{
		char str[100];
		size_t i, j, len;
		int r;

		printf("Enter a sentence: \n");
		fgets(str, 100, stdin);
		if (fgets(str, 100, stdin) == NULL) 
		{
			fprintf(stderr, ("fgets failed"));
			return -1;
		}

		str[strcspn(str, "\n")] = 0;
		printf("This is the sentence: %s\n", str);

		printf("Enter character to remove: \n");
		r = getchar();

		/*If getchar returns EOF, no need to go through character removal logic*/
		if (r != EOF) {
			len = strlen(str);

			i = 0;
			while (str[i] != '\0') {
				if (str[i] == (char)r) {
					for (j = i; j < len; j++) {
						str[j] = str[j + 1];
					}
					len--;
				}
				else
					i++;
			}
		}

		printf("Sentence after removal: %s\n", str);
	}
	if (x == 5)
	{
		char str[100] = "";
		size_t len;
		int r;

		printf("Enter a sentence: ");       
		fgets(str, 100, stdin);
		if (fgets(str, 100, stdin) == NULL)
		{
			fputs("fgets failed\n", stderr);  
			return 1;  
		}

		str[(len = strcspn(str, "\n"))] = 0;    //save len 
		printf("This is the sentence: '%s' (len: %zu)\n", str, len);

		if (len < 100 - 1)
		{
			printf("\nEnter character to add: ");
			if ((r = getchar()) != EOF) 
			{
				str[len++] = r;
				str[len] = 0;
				printf("This is the sentence: '%s' (len: %zu)\n", str, len);
			}
			else
				fputs("(user canceled input.)\n", stderr);
		}
		else {
			fputs("error: insufficient space to add char.\n", stderr);
			return 1;
		}
	}
	system("pause");
	return main();

	if (x == 6)
	{
		char str[100];
		size_t len;
		int r, i, j;
		struct newlen
		{
			char str[50];
		};
		
		printf("Write the sentece that should be used\n");
		fgets(str, 100, stdin);
		if (fgets(str, 100, stdin) == NULL)
		{
			fputs("fgets failed\n", stderr);
			return 1;
		}

		str[(len = strcspn(str, "\n"))] = 0;
		printf("Choose the letter that should be replaced:\n");
		r = getchar();

		if (r != EOF) {
			len = strlen(str);

			i = 0;
			while (str[i] != '\0')
			{
				if (str[i] == (char)r)
				{
					for (j = i; j < len; j++)
					{
						str[j] = str[j + 1];
					}
					newlen = newlen.replace(str[j + 1], r);
				}
				else
					i++;
			}
		}

		printf("Sentence after replacement: %s\n", str);

	}
}

2 Ответов

Рейтинг:
1

Patrice T

system("pause");
return main(); // This line prevent

if (x == 6) // this line and following from ever be executed

Эмпирическое правило: main-это специальное имя в вашем коде, и его никогда не следует вызывать из любого места вашего кода, это плохая идея.
В вашем случае использование цикла было бы более уместным.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
0

Rick York

There are a lot of problems with this code. The first one is, each of the code modules you have for the menu selections should be moved into their own separate function. Second, you should not recursively call main. The code in main should be made into a big loop that continues until exit is selected and then you can break from the loop and return a value. Third, as your code to replace the character is close but needs a little work. You don't have a replace method implemented in the newlen structure and if you aren't going to then you shouldn't declare a structure to contain just one member. If you are going to implement the replace method then you should not have the loop above it to eliminate the selected character. One of those two are not necessary.


Member 14103987

разве newlen = newlen.replace не должно быть достаточно для того, чтобы программа знала, что делать? Я получаю ошибку говоря что у меня должна быть структура для newlen но для меня это не имеет никакого смысла

Rick York

Есть ли в этой структуре член с именем replace? Я не вижу ни одного, и он ни из чего не выводится, так что нет, этого недостаточно для того, чтобы программа знала, что делать.

Member 14103987

Я думал что просто наличие str внутри структуры будет работать но я явно ошибался

структура newlen
{
char str[50];
};

Однако чего мне не хватает, если у меня есть что-то большее, чем размер str?