如何编写指向函数?

时间:2018-08-10 13:03:17

标签: c

我在使用指针和功能部件时遇到了麻烦。我被要求编写函数:char *mytoupper(char *p),它将p指向的字符串转换为大写字母,然后转换为returns p

请注意,我不能使用<string.h>函数。这是我的方法吗?

#include <stdio.h>

char *mytoupper(char *p);

int main(int argc, char const *argv[]) {
    char str[100];
    printf("Please enter a string: ");
    scanf("%s", str);

    mytoupper(str);
    printf("The upercased string is: %s\n", str);
}

char mytoupper(char *p) {
    char result = *p;
    while (*p != '\0') {
        if ((*p >= 'a') && (*p <= 'z')) {
            *p = *p - 32;
        }
        p++;
    }
    return result;
}

请帮助我检查一下。我只编码了一个月。我感谢所有帮助。

4 个答案:

答案 0 :(得分:3)

在函数声明中

char *mytoupper(char *p);

您说它返回char *(指向char的指针)

在您的定义中,您说它仅返回char

char mytoupper(char *p)

两个定义必须匹配,因此将其更改为

char *mytoupper(char *p)

,然后在函数内部不存储第一个字符;存储指向第一个字符的指针并返回它。

char *result = p;
....
return result;

答案 1 :(得分:3)

请勿忽略错误和警告

您的代码将无法编译,并且您会收到错误消息:

main.c:14:6: error: conflicting types for 'mytoupper'
 char mytoupper(char *p) {
      ^
main.c:3:7: note: previous declaration of 'mytoupper' was here
 char *mytoupper(char *p);
       ^
main.c: In function 'main':
main.c:8:5: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%s", str);
     ^

准确指出问题所在。

还有另一个问题,因此请查看已更正的问题(但仅在char是ASCII编码的情况下才有效)

char *mytoupper(char *p) 
{
    char *savedptr = p;
    if(p) 
    {
        while (*p) 
        {
            if ((*p >= 'a') && (*p <= 'z')) 
            {
                *p -= ('a' - 'A');
            }
            p++;
        }
    }
    return savedptr;
}

答案 2 :(得分:1)

这部分非常依赖平台:

while (*p != '\0') {
    if ((*p >= 'a') && (*p <= 'z')) {
        *p = *p - 32;  
    }
    p++;
}

好的(便携式)代码并不假定所有字母都是连续的,也不假设a .. z之外没有字母,或者小写字母都比大写字母小32。除非您将自己限制为ASCII的美国变体,否则所有这三个假设都是错误的(仅举几个例子,EBCDIC大写字母比小写字母大64个位置,而在非美国语言环境中的ASCII具有诸如{{ 1}}和åøa范围之外。

相反,我们可以使用z中提供的功能,特别是在<ctype.h>

toupper()

请注意,这也解决了#include <stdio.h> #include <ctype.h> char *mytoupper(char *p); /* use (void) when we ignore arguments */ int main(void) { char str[100]; printf("Please enter a string: "); /* scanf("%s") is dangerous! Always */ /* limit input length and check result */ if (scanf("%99s", str) != 1) { fputs("Failed to read input!\n", stderr); return 1; } mytoupper(str); /* spelling fixed */ printf("The uppercased string is: %s\n", str); } /* Convert the string pointed to by s into uppercase. s must not be a null pointer */ char *mytoupper(char *const s) { for (char *p = s; *p; ++p) { *p = toupper((unsigned char)*p); } return s; } 中的某些问题-请参阅注释。

答案 3 :(得分:0)

如果要将所有字符都转换为大写,请查看ASCII表。您可能知道,每个字符都有一个整数值。例如,A的值为65。因此,遍历所有元素并检查该值是否大于(int)'a'。如果是这样,则从字符中减去((int)'a'-(int)'A')。

示例

int counter = 0;

while (p[counter] != '\0')
{
     if ((int) p[counter] >= (int) 'a')
     {
          p[counter] -= (int) 'a' - (int) 'A';
     }

    counter++;
}