将小写字母转换为大写字母错误:获得正确(在结果中)

时间:2014-11-14 08:13:39

标签: c

我正在学习C语言。我编写了一个程序,要求用户输入他们的名字并以大写字母打印出他们的名字,例如: - 如果用户输入Stack Overflow作为他的名字,它会打印出STACK OVERFLOW。但是,当我运行该程序时,它只是给出了(作为输出,你可以把它弄清楚代码的错误吗?我正在使用Code::Blocks(版本13.12)。

这是我的代码: -

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char name[25] ;
    char name_up[25] ;
    int i ;

    fputs("Enter your name : " , stdout) ;
    fgets(name , 24 , stdin) ;

    for(i=0 ; i<strlen(name) ; i++)
    {
        if(name[i] == '\n')
        {
            break ;
        }
        else
        {
            if(islower(name[i]))
            {
                name[i] = toupper(name_up[i]) ;
            }
            else
            {
                name[i] = name_up[i] ;
            }
        }
    }

    printf("Entered name is : %s .\nEntered name in upper case is : %s ." , name , name_up) ;
    return 0;
}

3 个答案:

答案 0 :(得分:3)

好吧,你丢失了string.h and ctype.h个头文件,你的变量已被颠倒过来了:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char name[25] = {0};      /* initializing string arrays to null (zero) insures they */
    char name_up[25] = {0};   /* are null-terminated for strings less than 25 chars     */
    int i ;

    fputs("Enter your name : " , stdout) ;
    fgets(name , 24 , stdin) ;

    for(i=0 ; i<strlen(name) ; i++)
    {
        if(name[i] == '\n')
        {
            name[i] = 0;      /* strip newline from end of name    */
            name_up[i] = 0;   /* do not include newline in name_up */
            break ;
        }
        else
        {
            if(islower(name[i]))
            {
                name_up[i] = toupper(name[i]) ;    /* You assign name_up = name    */
            }                                      /* you had it reversed...       */
            else
            {
                name_up[i] = name[i] ;
            }
        }
    }

    printf("Entered name is : %s.\nEntered name in upper case is : %s.\n" , name , name_up) ;
    return 0;
}

<强>输出:

$./bin/chgcase
Enter your name : StackOverflow
Entered name is : StackOverflow.
Entered name in upper case is : STACKOVERFLOW.

注意:始终初始化变量(包括数组)。从长远来看,这将为你节省许多悲伤。此外,始终在启用警告的情况下进行编译。这将告诉您代码中关注区域的位置。 E.g:

gcc -Wall -Wextra -o bin/chgcase changecase.c

答案 1 :(得分:1)

for(i=0 ; i<strlen(name) ; i++)更改为for(i=0 ; name[i] != '\n' ; i++)并删除阻止:

    if(name[i] == '\n')
    {
        break ;
    }

改变它:

        if(islower(name[i]))
        {
            name[i] = toupper(name_up[i]) ;
        }
        else
        {
            name[i] = name_up[i] ;
        }

为:

        if(islower(name[i]))
        {   
            name_up[i] = toupper(name[i]) ;
        }
        else
        {   
            name_up[i] = name[i] ;
        }

哦,是的,添加行#include <ctype.h>

是的,忘了在name_up的末尾添加一个终止空值 在&#34; for循环&#34;添加以下内容:name_up[i] = '\0';,可能是:name[i] = '\0';

答案 2 :(得分:0)

你必须改变name [i]和name_up [i]的位置。否则,您将使用空的name_up数组覆盖name数组。

else
    {
        if(islower(name[i]))
        {
            name_up[i] = toupper(name[i]) ;
        }
        else
        {
            name_up[i] = name[i] ;
        }
    }