【问题标题】:Strchr removing the part I wantStrchr 删除我想要的部分
【发布时间】:2016-05-02 15:51:25
【问题描述】:

所以我在玩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 以最终将其传递给另一个函数。谢谢

【问题讨论】:

  • 很多方法。但这取决于您希望如何返回该值。即,修改name 缓冲区,使其仅包含所需的字符串或分配动态内存,复制所需的字符串并返回?如果您可以修改name,那么只需在strchr 调用之后添加以下内容:*ptr='\0'; printf("%s\n", name);(省略错误检查)。

标签: c string strchr


【解决方案1】:

你没有输zelda;指针name 仍然指向它。

您可以使用(以及其他技术)打印zelda

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

与许多替代方法相比,这种技术的优势在于原始字符串仍然完好无损——未经修改。这意味着它也适用于字符串为 const 字符串(例如字符串文字)时。

【讨论】:

【解决方案2】:

您可以将其复制到另一个字符串,也可以使用此技巧:

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 */
}

【讨论】:

  • 我应该在问题中提出这个问题,但我想我可以弄清楚。关于如何移动到 1,然后是下一个字符串的任何想法。几乎做了我们为 zelda 所做的事情,但对于整个字符串?
  • 只是坐在一个循环中并前进ptr直到它到达终点并没有太大的不同。除非您不介意更改 name,否则您将需要一个额外的指针。如果您不介意更改字符串,也许您实际上是在寻找 strtok
【解决方案3】:
#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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多