C中的char函数应该返回什么?

C中的char函数应该返回什么?,c,function,pointers,char,scanf,C,Function,Pointers,Char,Scanf,我想知道char函数应该返回什么 以这段代码为例: #include <stdio.h> char *convert(char *str); int main() { char *str[1000]; printf("Enter a string: "); scanf("%[^\n]s", str); printf("\nOutput: %s\n", str); convert(str); printf("\nAfter conv

我想知道char函数应该返回什么

以这段代码为例:

#include <stdio.h>

char *convert(char *str);

int main() {

    char *str[1000];
    printf("Enter a string: ");
    scanf("%[^\n]s", str);
    printf("\nOutput: %s\n", str);
    convert(str);
    printf("\nAfter converting to lowercase: %s\n\n", str);

    return 0;
}

char *convert(char *str) {

    int i = 0;
    char *p;
    char *c;

    while (str[i] != '\0') {
        if (str[i] >= 'A' && str[i] <= 'Z') {
            str[i] = str[i] + 32;
        }
        i++;
    }

    for (p = c = str; *p != '\0'; p++) {
        *c = *p;
        if (*c < '0' || *c > '9') {
            c++;
        }
    }
    *c = '\0';

    return str;
}
我在char*convert函数中返回str,但即使我不返回任何内容或返回0,此代码也可以正常工作。我应该将此函数更改为void吗?这段代码可以吗?

我应该将此函数更改为void吗?这个代码行吗

您总是希望将函数的返回类型与函数的预期使用方式相匹配。从convert返回char*没有问题。由于在convert中不更改str的地址,因此可以选择将return用作另一个函数的参数,例如:

printf("\nAfter converting to lowercase: %s\n\n", convert (str));
如果您已将convert声明为void,那么这将不再是一个选项。但是,通过返回str,您也无法更改str在函数中的位置。例如,在转换为小写时,您不能简单地在函数中增加str++,这不是一个限制,只是需要注意。真的,两种方法都可以

至于convert函数本身,它不会压缩它在str中删除的数字两侧的空格。例如,如果输入字符串:

My dog HAS 23 Fleas
作为输入,您将收到:

my dog has  fleas
作为输出,字符串中仍然存在23任一侧的双空格。您可以通过添加跟踪连续空格的标志或添加其他测试来清除此问题

我的最后一点意见是将convert重构为两个函数,一个用于转换为小写,比如str2lower,另一个用于删除数字,比如strrmdigits。允许您独立地重用这些函数。有很多次您想要转换为小写,可能有一些您想要删除数字,但是很少有次您想要转换为小写并从字符串中删除数字。所以在分解代码时要提前考虑

将您的转换拆分为str2lower和strrmdigits可以如下所示:

char *str2lower (char *str)  /* convert string to lower case */
{
    for (char *p = str; *p; p++)
        if ('A' <= *p && *p <= 'Z')
            *p ^= ('A' ^ 'a');    /* works for ASCII & EBCDIC */

    return str;
}
示例使用/输出


仔细检查一下,如果您还有其他问题,请告诉我。

请打开编译器警告-您至少有一个非常明显的错误,如果您允许,编译器会很高兴地警告您。您忽略了调用中的返回值,因此返回什么都无所谓。char*str[1000];您真的想要一个指向其中char 1000的指针数组,还是想要一个char数组,比如char str[1000]=;可以存储最多999个字符+1个nul终止符的字符串??
char *strrmdigits (char *str)   /* remove included digits */
{
    char *p = str;      /* pointer used to elminate digits */
    int nspace = 0;     /* flag tracking consequtive spaces */

    for (int i = 0; str[i]; i++)    /* loop over each char */
        if (str[i] < '0' || '9' < str[i]) { /* digit? */
            if (str[i] != ' ') {    /* if not a space */
                *p++ = str[i];      /* write character */
                nspace = 0;         /* set space count 0 */
            }   /* otherwise */
            else if (!nspace) {     /* no space written yet? */
                *p++ = str[i];      /* write space */
                nspace = 1;         /* set space written flag */
            }
        }

    *p = 0;     /* nul-terminate at p */

    return str;
}
#include <stdio.h>

#define MAXC 1000   /* if you need a constant, #define one (or more) */

char *str2lower (char *str);
char *strrmdigits (char *str);

int main (void) {

    char str[MAXC] = "";                /* initialize all strings zero */

    printf ("Enter a string: ");
    if (scanf ("%999[^\n]s", str) != 1) {   /* always validate return */
        fputs ("error: invalid input.\n", stderr);
        return 1;
    }
    printf ("\nOutput: '%s'\n\n", str);

    printf ("to lowercase  : '%s'\n\n", str2lower (str));
    printf ("digits removed: '%s'\n", strrmdigits (str));

    return 0;
}
$ ./bin/charrtn
Enter a string: My dog HAS 23 Fleas

Output: 'My dog HAS 23 Fleas'

to lowercase  : 'my dog has 23 fleas'

digits removed: 'my dog has fleas'