C 只返回空格和字母的函数

C 只返回空格和字母的函数,c,function,char,definition,c-strings,C,Function,Char,Definition,C Strings,我正在尝试编写一个函数,该函数使用给定的char字符串返回相同的字符串,但除了字母和空格外,不返回任何内容 我差一点就搞定了,但我一直坚持删除“.”、“/”等符号 这里已经运行了代码,但我只是描述了一个问题 char* zastap(const char *napis) { char* jeden = napis; char* dwa = napis; while (*jeden) { if(isdigit(*dwa)) { dwa

我正在尝试编写一个函数,该函数使用给定的char字符串返回相同的字符串,但除了字母和空格外,不返回任何内容

我差一点就搞定了,但我一直坚持删除“.”、“/”等符号

这里已经运行了代码,但我只是描述了一个问题

char* zastap(const char *napis) {
    char* jeden = napis;
    char* dwa = napis;
    while (*jeden) {
        if(isdigit(*dwa)) {
            dwa++;
            continue; }
        *jeden++ = *dwa++;
    }
    *jeden = '/0';
    return napis;
}
哦,顺便说一句,它必须以这种形式制作-我的意思是“char*zastap(const char*napis)”


如果有人能告诉我解决这个问题的正确方法,我会很高兴的。我想这是循环中非常基本的条件,但我无法理解。

对于初学者来说,函数的声明是错误的。应该这样宣布

char * zastap( char *napis );
               ^^^^^^^^^^^^ 
否则,该声明会混淆函数的用户。他们会认为函数创建了原始字符串的副本

不应使用函数检查
isdigit
,而应使用函数检查
isalpha
isblank
,如果字符满足这些函数,则将其写入结果字符串

在函数中,此循环语句

while (*jeden)
有一个无效的条件

看来你是说

while (*dwa)
终止的零字符是
'\0'
而不是
'/0'

这是一个演示程序

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

char * zastap( char *napis ) 
{
    char *p = napis, *q = napis;

    do
    {
        if ( !*q || isalpha( ( unsigned char )*q ) || isblank( ( unsigned char )*q ) )
        {
            *p++ = *q;
        }
    } while ( *q++ );

    return napis;
}

int main(void) 
{
    char napis[] = "2019Alek Lucek Kamiński2019";

    puts( napis );
    puts( zastap( napis ) );

    return 0;
}
可以在循环内的if语句中替换此语句

*p++ = *q;
对于这些声明

if ( p != q ) *p = *q;
++p; 

对于初学者来说,函数的声明不正确。应该这样宣布

char * zastap( char *napis );
               ^^^^^^^^^^^^ 
否则,该声明会混淆函数的用户。他们会认为函数创建了原始字符串的副本

不应使用函数检查
isdigit
,而应使用函数检查
isalpha
isblank
,如果字符满足这些函数,则将其写入结果字符串

在函数中,此循环语句

while (*jeden)
有一个无效的条件

看来你是说

while (*dwa)
终止的零字符是
'\0'
而不是
'/0'

这是一个演示程序

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

char * zastap( char *napis ) 
{
    char *p = napis, *q = napis;

    do
    {
        if ( !*q || isalpha( ( unsigned char )*q ) || isblank( ( unsigned char )*q ) )
        {
            *p++ = *q;
        }
    } while ( *q++ );

    return napis;
}

int main(void) 
{
    char napis[] = "2019Alek Lucek Kamiński2019";

    puts( napis );
    puts( zastap( napis ) );

    return 0;
}
可以在循环内的if语句中替换此语句

*p++ = *q;
对于这些声明

if ( p != q ) *p = *q;
++p; 

编译器是否抱怨多字符常量?(应该)
'/0'
应该是
'\0'
。这不是你的主要问题。如果你想要字母和空格,你不应该使用
isalpha()
isspace()
(或者
isblank()
)吗?除了数字之外,还有其他非字母!编译器是否抱怨多字符常量?(应该)
'/0'
应该是
'\0'
。这不是你的主要问题。如果你想要字母和空格,你不应该使用
isalpha()
isspace()
(或者
isblank()
)吗?除了数字之外,还有其他非字母!不清楚为什么代码有
*q | |
因为空字符既不是字母也不是空白。不清楚为什么代码有
*q | |
因为空字符既不是字母也不是空白。