【问题标题】:How do i have my ppinter point to the new string i created我如何让我的指针指向我创建的新字符串
【发布时间】:2021-10-12 16:47:12
【问题描述】:
void strip_out(char *str) {


    int length_string = strlen(str);
    //printf("%d\n", length_string);
    char temp[length_string];
    int i = 0;
    int j = 0;
  while ((*(str + i) != '\0')) {

    if (isalpha(str[i])) {
            //printf("yes\n");
           *(temp + j) = *(str + i);
            i++;
            j++;
            }
        else {
            //printf("No\n");
            i++;
            }


     }

我需要将我的 *str 值更改为 temp 的值,以便我可以在另一个函数中使用它。

我无法更改返回类型,如果可以的话,我可以只返回temp,但它必须是void

【问题讨论】:

  • 为什么不返回“新”字符串?
  • 最简单的事情就是把strcpy你的temp最后变成str
  • 另一种选择是循环之后的strcpy(str, temp)
  • *(temp + j)更常见的是temp[j]
  • 您可以就地进行转换。您只需要保留两个索引来指向您正在读取的位置和正在写入的位置。与您目前的逻辑几乎相同。

标签: c c-strings strip function-definition isalpha


【解决方案1】:

如果你想改变一个字符串,删除所有非字母字符,那么不需要定义一个辅助数组。

该功能可以如下面的演示程序所示。

#include <stdio.h>
#include <ctype.h>

char * strip_out( char *s )
{
    char *p = s;

    for ( char *q = s; *q != '\0'; ++q )
    {
        if ( isalpha( ( unsigned char )*q ) )
        {
            if ( p != q ) *p = *q;
            ++p;
        }
    }

    *p = '\0';

    return s;
}


int main(void) 
{
    char s[] = "1H2e3l4l5o";

    puts( s );

    puts( strip_out( s ) );
    
    return 0;
}

程序输出是

1H2e3l4l5o
Hello

如果您想根据传递的参数创建一个新字符串,则该函数可以如下所示,如下一个演示程序所示。

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

char * strip_out( const char *s )
{
    size_t n = 0;

   for ( const char *q = s; *q != '\0'; ++q )
    {
        if ( isalpha( ( unsigned char ) *q ) ) ++n;
    }

    char *result = malloc( n + 1 );

    if ( result != NULL )
    {
        char *p = result;

        for ( const char *q = s; *q != '\0'; ++q )
        {
            if ( isalpha( ( unsigned char )*q ) )
            {
                *p++ = *q;
            }
        }

        *p = '\0';
    }

    return result;
}


int main(void) 
{
    const char *s = "1H2e3l4l5o";

    puts( s );
    
    char *p = strip_out( s );

    if ( p != NULL ) puts( p );

    free( p );
    
    return 0;
}

程序输出同上图

1H2e3l4l5o
Hello

【讨论】:

    【解决方案2】:

    考虑到您无法更改返回类型,您可以:

    • strcpy添加最后一个调用;
    • 修复缺少字符串空字符 ('\0') 的问题。如果没有终端 strcpy 将继续处理超过 temp 字符数组末尾的数据,直到它碰巧在内存中找到一个零字节。
    void strip_out(char *str)
    {
      char temp[strlen(str)];
      int j = 0;
    
      for (int i = 0; str[i]; ++i)
        if (isalpha(str[i]))
        {
          temp[j] = str[i];
          ++j;
        }
      temp[j] = '\0';
    
      strcpy(str, temp);
    }
    

    出于教育目的,有意使代码与原始代码尽可能相似。

    就地转换Vlad's answer 的第一部分)可能应该是首选。

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多