在c语言中实现将小写字符串转换为大写字符串的功能

在c语言中实现将小写字符串转换为大写字符串的功能,c,string,function,C,String,Function,我还是一个函数和C编程的初学者。 我试图创建一个函数来将其转换为大写,但似乎我在指针处把它弄糟了(?) #包括 void mytoupper(char*s[]{ int i=0; 而(s[i]!='\0'){ 如果(s[i]>='a'&&s[i]在代码中有一些地方不能像预期的那样工作 您没有正确获取用户输入,而是试图打印一个“空”字符串 printf("%s",s); 您可以将此更改为: scanf("%31s",s); 您正在函数mytoupper中接受一个字符指针数组,但这不是必需的。

我还是一个函数和C编程的初学者。 我试图创建一个函数来将其转换为大写,但似乎我在指针处把它弄糟了(?)

#包括
void mytoupper(char*s[]{
int i=0;
而(s[i]!='\0'){

如果(s[i]>='a'&&s[i]在代码中有一些地方不能像预期的那样工作

  • 您没有正确获取用户输入,而是试图打印一个“空”字符串

    printf("%s",s);
    
    您可以将此更改为:

    scanf("%31s",s);
    
  • 您正在函数
    mytoupper
    中接受一个字符指针数组,但这不是必需的。您只需向它传递一个字符数组即可

    void mytoupper(char s[]) 
    
  • 您正试图使用
    void
    函数的返回值。您可以调用该函数,然后打印字符串,也可以让函数返回字符串

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

    mytoupper(s);
    printf("%s", s);
    
    或将功能更改为:

    char* mytoupper(char s[]) {
    
    然后打印字符串:

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

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

    • 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;
    }
    
    #包括
    char*mytoupper(char*s){
    int i=0;
    而(s[i]!='\0'){
    
    如果(s[i]>=“a”和&s[i]你可能想
    scanf
    而不是
    printf(“%s”,s);
    在代码中输入错误:
    printf(“%s”,s);
    scanf(“%s”,s);
    不管其他缺陷。
    mytoupper(s[32])
    mytoupper(s)
    mytoupper(s)
    void mytoupper(char s[)
    需要是
    void mytoupper(char*s)
    void mytoupper(char s[])
    …并且它不应该返回任何内容。第二次破坏
    printf(“%s”,mytoupper(s[32]);
    行。
    scanf(“%s”,“s”);
    传递了错误的类型。删除
    &
    ,并建议使用宽度限制。
    scanf(“%31s”,s);
    -或者更好,使用
    fgets()
    scanf(“%s”和&s);
    是错误的。如果
    s
    是本地定义的,它可能“起作用”,但是如果
    s
    是一个函数参数,那么
    s
    &s
    char*s[]
    不是指向数组的指针,它是一个指针数组。谢谢你的回答。当我给它空格时,它只是第一个单词的大写。为了防止它,我应该使用fgets吗?
    scanf
    with
    %s
    只读取一个单词。如果你想处理整行,请使用具有更大缓冲区的
    fgets
    。如果你想处理who标准输入流内容,使用while循环,测试
    fgets()
    while(fgets(s,sizeof s,stdin)){fputs(mytoupper(s),stdout);}
    #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;
    }