-1
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++;
            }


     }

I need my *str value to be changed to the value of temp so i can use it in another function.

I cannot change the return type, if i could I could just return temp but it has to be void.

4

2 回答 2

0

如果您想更改一个字符串以删除所有非字母字符,则无需定义辅助数组。

该函数如下面的演示程序所示。

#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
于 2021-10-12T17:04:05.497 回答
0

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

  • 添加最终调用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);
}

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

可能应该首选就地转换(弗拉德回答的第一部分)。

于 2021-10-14T09:35:56.740 回答