在c

时间:2018-06-27 20:42:44

标签: c string function

我仍然是进行函数和C编程的初学者。 我正在尝试制作一个将其转换为大写的函数,但是似乎我把它弄乱了指针(?)

#include <stdio.h>

void mytoupper(char *s[]) {
    int i = 0;
    while (s[i] != '\0') {
        if (s[i] >= 'a' && s[i] <= 'z') {
            s[i] = s[i] - 32;
        }
        i++;
    }
    return s;
}

int main(void) {
    char s[32];
    printf("Insert string:");
    printf("%s", s);
    printf("%s", mytoupper(s[32]));
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题:

  • mytoupper的定义不正确:它应该使用char *s而不是char *s[]的参数,然后返回char *
  • 将字符从小写改为大写不应使用仅适用于ASCII的硬编码值32,而对于s[i] = s[i] - 'a' + 'A';使用更通用的方法
  • 要读取字符串,请使用scanf("%31s", s);而不是printf("%s", s);,强烈建议测试scanf()的返回值
  • printf("%s", mytoupper(s[32]));中的参数不正确:您应该只写printf("%s", mytoupper(s));

这是更正的版本:

#include <stdio.h>

char *mytoupper(char *s) {
    int i = 0;
    while (s[i] != '\0') {
        if (s[i] >= 'a' && s[i] <= 'z') {
            s[i] = s[i] - 'a' + 'A';
        }
        i++;
    }
    return s;
}

int main(void) {
    char s[32];
    printf("Insert string:");
    if (scanf("%31s", s) == 1) {
        printf("%s\n", mytoupper(s));
    }
    return 0;
}

答案 1 :(得分:0)

有些地方无法按您的代码预期工作。

  1. 您没有正确获取用户输入,而是尝试打印“空”字符串。

    printf("%s",s);
    

    您可以将其更改为:

    scanf("%31s",s);
    
  2. 您正在函数mytoupper中接受一个char指针数组,但这不是必需的。相反,您可以简单地将其传递给一个字符数组。

    void mytoupper(char s[]) 
    
  3. 您正在尝试使用void函数的返回值。您可以调用函数然后打印字符串,或者让函数返回字符串。

    如果要更改字符串然后单独打印,则需要更改mytoupper以不再返回任何内容,并将其保留为void返回类型。

    mytoupper(s);
    printf("%s", s);
    

    或将功能更改为:

    char* mytoupper(char s[]) {
    

    然后打印字符串:

    printf("%s", mytoupper(s));