Шарда бірінші таңбаны жою

Менде «char: asdsa» деген деректер бар char *

Мазмұнды ':' таңбасынан бұрын алып тастағым келеді. Мұны қалай жасауға болады? Көрсеткішті жылжыту үшін маған қажет нашар ұсыныстарды көрдім, бірақ мұны істеуді қаламаймын ба?

Мен кейбір ұсыныстар біле аламын ба?

4
«бірақ сіз мұны істегіңіз келмей ме?» Сіз ұсынатын альтернативті шешімді қалай орындағыңыз келетінін қалай білеміз? Өтінеміз, бізге осы шешіммен не дұрыс емес, сол ақаулықтардан зардап шегетін жауаптар жазуға уақыт жұмсамауымыз мүмкін.
қосылды автор R. Martinho Fernandes, көзі
Кейде мен STL құжаттамасын оқып жатырмын, және функцияның есімі ұзаққа созылған, және мен «МЕНІҢ ТҮРІМІМІЗ емес» деген сияқты. Стендті өшіріп тастайды, бірақ әдетте компьютер жеңеді.
қосылды автор Salgar, көзі

8 жауаптар

С-да сіз мұны істей аласыз:

char *newString = originalString + 4;

Енді сіз мұны істегіңіз келмесе, неге екенін түсіндіріңіз. Бізге мәселені айтыңыз!

Егер 4 немесе тағы бір нәрсе (тек қана орындау уақытында белгілі болуы мүмкін) екенін білмесеңіз, 'индексін табу үшін циклды пайдаланыңыз: Оны 4 орнына қолданыңыз. Бұл оңай міндет. Өзіңізді тексеріңіз. Іске сәт. :-)


Бұл бөлімді тек оқу мақсатына арнадым, себебі бұл сұрақ бастапқыда C ++ деп жазылғанда, мен C ++ -де жұмыс істейтін C бағдарламашыларына көмектеседі деп ойлаймын.

C ++, std :: string жолдармен жасайтын көптеген нәрселерді жеңілдетеді.

std::string s = "asd:asdsa";  //#include 
s = s.substr(s.find(':') + 1);

Бұл кодта substr() жолды : дегеннен кейін қайтарады, яғни оның мәні «asdsa» дегенді білдіреді.

See Online Demo.

8
қосылды
@Fanael: Мен C ++ -де жауап бердім, себебі C ++ деп белгіленді.
қосылды автор Nawaz, көзі
Мақсатты көрсетпестен мені кім төмендетді?
қосылды автор Nawaz, көзі
@Fanael Бұл C ++ ретінде бұрынғы тегтер болды. Енді C дегенге ауысады.
қосылды автор Mahesh, көзі
@Mahesh: бірақ бұл енді емес!
қосылды автор Fanael, көзі
std :: string C ішінде жоқ.
қосылды автор Fanael, көзі

Мен strchr және memmove қоспасын жасау керек.

char *res = strchr(str, ':');
if (res)
  memmove(str, res + 1, strlen(res + 1) + 1);
2
қосылды
strcpy (res) функциясы жоқ ...
қосылды автор Kerrek SB, көзі
strcpy() - егер : жолдың бірінші жартысында болса, мұнда осылай болады. Оның орнына memmove (str, res + 1, strlen (res + 1) + 1) қолдануға болады.
қосылды автор caf, көзі
Анықталмаған мінез-құлыққа ұқсайды.
қосылды автор md5, көзі
@KerrekSB менің жаман, редакцияланған. рахмет
қосылды автор Thomas Ruiz, көзі
@caf Мен мұны білмедім. memmove бұл жағдайда жақсы көрінеді, назар аударғаныңыз үшін рахмет.
қосылды автор Thomas Ruiz, көзі
thanks.must i delete/free res?
қосылды автор soulslicer0, көзі

C функцияларын пайдалану:

#include 

char *p = strchr(s, '.');

if (p != NULL)
{
    memmove(s, p + 1, strlen(p));
}
1
қосылды

Сіз оны «нашар» шешімсіз алып тастай алмайсыз.

Бірақ жолдың үшінші жағдайының мекенжайын тікелей пайдалануға болады.

printf("%s\n", &str[3]);

Мысалға

1
қосылды

You can try to use strtok()

char mystr[] = "asd:asdasd";
char *split;
int second = 0;

split = strtok(mystr, ":");

  while (second < 2 && split != NULL)
  {
    split = strtok (NULL, ":");
    second++;
  }
puts(split);
1
қосылды
@nouney lol, енді емес
қосылды автор R. Martinho Fernandes, көзі
Egads, strtok , жоқ!
қосылды автор Fanael, көзі
Сұрақ c ++ белгісі
қосылды автор nouney, көзі
Aw, менің жаман.
қосылды автор nouney, көзі
Бірақ ол char * функциясын пайдаланады, сондықтан неге c мүмкіндіктерін пайдаланбау керек
қосылды автор 3wic, көзі

Наваз бұрын айтқандай, std :: string сөзін қолданыңыз, бірақ my_data </​​code> қолданыңыз.

char* original_data = "asd:asdasd";
char* my_data = original_data + 4;//points to: "asdasd"
1
қосылды

Егер деректер тек оқу орнына нұсқайтын болса, оны өзгерте алмайсыз. Бұл оңай болуы мүмкін std :: string .

std::string str("asd:asdsa");
size_t loc = str.find(':') + 1;
str.erase (str.begin(), str.begin() + loc);
0
қосылды
Сұрақ C ретінде белгіленеді (немесе кем дегенде қазір!)
қосылды автор DaV, көзі

Сіз char * функциясын қолданғандықтан, көрсеткішпен ойнауға тура келеді бірақ c ++-де болсаңыз, неге std :: string пайдаланбаңыз?

Қалай болғанда да сіз str * үшін char * функциясын пайдалана аласыз, бірақ сіз меңзерді басқарасыз

0
қосылды