Łączenie łańcuchów

0

Cześć, mam takie pytanie. Do zmiennej: char * value = ASCIIToDecimal(cmd); lecą znaki ASCI przerobione na format dziesiętny z zmiennej: char cmd[] = "WRBA|11|9|"; W zmiennej: char cmd2[] = "WRBA|11|9|3"; pobieram ostatni znak na końcu czyli 3 char digit = cmd2[strlen(cmd2) - 1]; Chciałby dodać go na sam koniec zmiennej value: strcat(value, digit); Niestety program nie działa. Co zrobić żeby liczba 3 zostła dodana na koniec zmiennej value? Zmienna value ma dane: 87826665124494912457124 i chce tam dodać na koniec tą trójkę czyli 878266651244949124571243

#include "stdarg.h"
#include "string.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

char* AppendString(const char* str1, const char* str2) {
	int str1Len = strlen(str1);
	int str2Len = strlen(str2);
	int strLen = str1Len + str2Len + 1;
	char* str = malloc(strLen);

	for (int i = 0; i < str1Len; i++)
		str[i] = str1[i];

	for (int i = 0; i < str2Len; i++)
		str[(str1Len + i)] = str2[i];

	str[strLen - 1] = '\0';

	return str;
}

char* GetSubString(char* str, int index, int count) {
	int strLen = strlen(str);
	int lastIndex = index + count;

	if (index >= 0 && lastIndex > strLen) return "";

	char* subStr = malloc(count + 1);

	for (int i = 0; i < count; i++) {
		subStr[i] = str[index + i];
	}

	subStr[count] = '\0';

	return subStr;
}

char* InsertString(char* str, int index, char* subStr) {
	char* s = GetSubString(str, 0, index);
	s = AppendString(s, subStr);
	s = AppendString(s, GetSubString(str, index, strlen(str) - index));

	return s;
}

char* ASCIIToDecimal(char* str) {
	char* dec = "";
	int strLen = strlen(str);

	for (int i = 0; i < strLen; ++i)
	{
		char* cDec = malloc(11);
		//itoa(str[i], cDec, 10);
		sprintf(cDec, "%d", str[i]);

		int cDecLen = strlen(cDec);

		if (cDecLen < 3)
			for (size_t j = 0; j < (3 - cDecLen); j++)
				cDec = InsertString(cDec, 0, "");

		dec = AppendString(dec, cDec);
	}

	return dec;
}


int main()
{
    char cmd[] = "WRBA|11|9|";
    char cmd2[] = "WRBA|11|9|3";
    char * value = ASCIIToDecimal(cmd);
    char digit = cmd2[strlen(cmd2) - 1];
    strcat(value, digit);
    printf("%d\n\r", digit);
    printf("%s\n\r", value);

}
3

W jaki sposób to kompilujesz, że nie dostajesz segfaulta?

Co zrobić żeby zmienna digit miała cyfrę 3

digit jesty typu znakowego, więc co rozumiesz przez to, że ma mieć cyfrę? Nie potrafisz dobrze nazwać tego, co chcesz osiągnąć przez co nie wiadomo do końca jak Ci odpowiedzieć. Niestety 3 nie jest pobieranie jako cyfra trzy tylko znak ASCI 51 Otóż dziesiętny kod ascii 51, który teraz wyświetlasz, odpowiada znakowi ascii 3. Jeżeli wyświetlisz to w ten sposób printf("%c\n\r", digit); to wyświetli Ci się 3 właśnie.

Reszty w tej chwili nie chce mi się komentować, bo z tym kodem jest wiele rzeczy do poprawy, może później mnie najdzie.

(edit)
Jeżeli potrzebujesz wyświetlić cyfry w stringu to możesz to zrobić dużo proście.

    char cmd[] = "WRBA|11|9|";
    char cmd2[] = "WRBA|11|9|3";

    const int cmdLen = strlen(cmd);
    const int cmd2Len = strlen(cmd2);
    
    for(int i = 0; i<cmdLen; ++i)
    {
        if(isdigit(cmd[i]))
            printf("%c", cmd[i]);
    }
    printf("\n\n");

    for(int i = 0; i<cmd2Len; ++i)
    {
        if(isdigit(cmd2[i]))
            printf("%c", cmd2[i]);
    }
1

Czyli jak w value jest 87826665124494912457124 to na koniec chcę dodać liczbę 3 czyli 878266651244949124571243

No ale to nie ma sensu, bo pozostałe liczby w tym ciągu to właśnie dziesiętne kody ASCII. Jakbyś chciał dodać 51 na koniec to wtedy miałoby to sens. Ale jak chcesz zrobić dokładnie to, jak i wyświetlać trójkę to użyj takiego kodu

    char *digit = cmd2 + (strlen(cmd2) - 1);
    strcat(value, digit);
    printf("%s\n\r", digit);

i chyba powinno działać jeśli value ma wystarczająco dużo miejsca.

0
several napisał(a):

Czyli jak w value jest 87826665124494912457124 to na koniec chcę dodać liczbę 3 czyli 878266651244949124571243

No ale to nie ma sensu, bo pozostałe liczby w tym ciągu to właśnie dziesiętne kody ASCII. Jakbyś chciał dodać 51 na koniec to wtedy miałoby to sens. Ale jak chcesz zrobić dokładnie to, jak i wyświetlać trójkę to użyj takiego kodu

    char *digit = cmd2 + (strlen(cmd2) - 1);
    strcat(value, digit);
    printf("%s\n\r", digit);

i chyba powinno działać jeśli value ma wystarczająco dużo miejsca.

Dzięki. Działa tak jak chciałem. Wielkie dzięki. Życie mi ratujesz! Jeszcze raz bardzo dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1