Strchr удаляя ту часть, которую я хочу

Так что я дурачусь с strchr получить часть строки из файла:

void manipulateComputers(char *name)
{
    name[strlen(name)-2] = '\0';
    printf("%s\n", name);

    char *ptr = strchr(name, ' ');
    printf("%s\n", ptr); 
}

Во-первых printf это читает:zelda 1 flux 1 hydra 1 willow 1 swift 1 aeon 1 neptune 1

На втором printf это читает: 1 flux 1 hydra 1 willow 1 swift 1 aeon 1 neptune 1

Как видите, zelda ушел, что-то вроде того, что я хотел сделать. Я хотел удалить zelda, но сейчас я хочу использовать zelda,

По сути, я хотел второй printf просто напечатать zelda а не строка без zelda, Как я могу получить это zelda в конечном итоге передать его другой функции. Спасибо

3 ответа

Решение

Вы не потеряли zelda; указатель name все еще указывает на это.

Вы можете распечатать zelda используя (среди прочих методов):

int z_len = ptr - name;
printf("Zelda was here: %*.*s\n", z_len, z_len, name);

Преимущество этого метода перед многими альтернативами заключается в том, что исходная строка остается неизменной - неизмененной. Это означает, что это также работает, когда строка const строка, такая как строковый литерал.

Вы либо копируете это в другую строку, либо можете использовать этот трюк:

char *ptr = strchr( name, ' ' );
if( ptr )
{
    char old_val = *ptr;      /* Remember the old character (in this case we know it was ' ') */
    *ptr = '\0';              /* Terminate the sub-string */
    printf( "%s\n", name );
    *ptr = old_val;           /* Restore the original character */
}
#include<stdio.h>
#include<string.h>

int main()
{

char newarray[40];
char* array="zelda 1 flux 1 hydra 1 willow 1 swift 1 aeon 1 neptune 1";
printf("Orignal is :%s \n",array);
char *ptr = strchr(array, ' ');
if(ptr != NULL)
{
printf("%s\n", ptr);
if((ptr-array) < 40){
        strncpy(newarray,array,(ptr-array)*sizeof(char));
        newarray[(ptr-array)] = '\0';
        printf("Filtered string is :%s",newarray);
}
}
return 0;
}

Итак, идея в том, что у вас есть начальный адрес строки, а теперь у вас также есть адрес, где заканчивается и эта часть строки. Итак, давайте скопируем столько строк в другой массив и используем их в дальнейшем. Когда я бегу

./a.out 
Orignal is :zelda 1 flux 1 hydra 1 willow 1 swift 1 aeon 1 neptune 1 
 1 flux 1 hydra 1 willow 1 swift 1 aeon 1 neptune 1
Filtered string is :zelda
Другие вопросы по тегам