【问题标题】:making a function of turning lowercase string into uppercase string in c在c中制作将小写字符串转换为大写字符串的功能
【发布时间】:2018-06-27 20:42:43
【问题描述】:

我仍然是制作函数和 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;
}

【问题讨论】:

  • 你可能想scanf而不是printf("%s", s);
  • 代码中的错字:printf("%s", s); to scanf("%s", s);,不管其他缺陷。
  • mytoupper(s[32]) -> mytoupper(s)
  • void mytoupper(char * s[]) 必须是 void mytoupper(char *s)void mytoupper(char s[])
  • ... 它不应该返回任何东西。第二次打破printf("%s", mytoupper(s[32])); 行。

标签: c string function


【解决方案1】:

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

  • mytoupper 的定义不正确:它应该采用 char *s 参数而不是 char *s[],并返回 char *
  • 将字符从小写更改为大写不应使用硬编码值32,该值仅适用于 ASCII,请使用更通用的方法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;
}

【讨论】:

  • 感谢您的回答。当我间隔它时,它只大写第一个单词。为了防止它,我应该使用 fgets 吗?
  • scanf%s 只读取一个字。如果您想处理整行,请使用fgets 和更大的缓冲区。如果你想处理整个标准输入流的内容,使用while循环,测试fgets()的返回值:while (fgets(s, sizeof s, stdin)) { fputs(mytoupper(s), stdout); }
【解决方案2】:

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

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

    printf("%s",s);
    

    您可以将其更改为:

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

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

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

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

    或者把函数改成:

    char* mytoupper(char s[]) {
    

    然后打印字符串:

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

【讨论】:

  • scanf("%s",&amp;s); 传递了错误的类型。删除&amp; 并建议使用宽度限制。 scanf("%31s",s); - 或者更好的是,使用 fgets()
  • scanf("%s",&amp;s); 是错误的。如果s 是在本地定义的,它可能会“工作”,但如果s 是函数参数,那么s&amp;s 之间存在很大差异。
  • char *s[] 不是指向数组的指针,而是指针数组。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多