C源代码,用于将字符串中的第一个字母从小写更改为大写

时间:2014-12-03 16:47:14

标签: c

我有一个C源代码,但我遇到了问题。我想转换从小写到大写的字符串中的单词的第一个字母,但它将所有字母都更改为大写。你能帮帮我解决这个问题吗?

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
void main()
{
    char sentence[100];
    int count, ch, i;
    int str[32];
    printf("Enter a sentence \n");
    for (i = 0; (sentence[i] = getchar()) != '\n'; i++)
    {
        ;
    }
    sentence[i] = '\0';
    /*  shows the number of chars accepted in a sentence */
    count = i;
    printf("The given sentence is   : %s", sentence);
    printf("\n Case changed sentence is: ");
    for (i = 0; i < count; i++)
    {
        ch = islower(sentence[i])? toupper(sentence[i]) : tolower(sentence[i]);
        putchar(ch);
    }
    getch();
}

e.g。

输入:欢迎来到谢里夫大学

期望的输出:欢迎来到谢里夫大学

实际输出:欢迎来到SHARIF大学

4 个答案:

答案 0 :(得分:2)

您必须检查当前字符是否为空格,然后仅在空格后的字符上使用toupper

答案 1 :(得分:0)

ch = ' ';
for (i = 0; i < count; i++)
{
    ch = isspace(ch) ? toupper(sentence[i]) : tolower(sentence[i]);
    putchar(ch);
}

答案 2 :(得分:-1)

您需要检查前面有空格的字符和大写字母。您还需要检查第一个特殊情况,因为它前面没有空格。

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

int main (void)
{
    char str[] = "this is a test string";
    int loop;

    for (loop=-1; loop<(int) strlen(str)-1; loop++)
    {
        // Possible upper case required?
        if (loop < 0 || str[loop]==' ')
            if (str[loop+1] >= 'a' && str[loop+1] <='z')
                str[loop+1] = (str[loop+1] - 'a') + 'A';
    }

    printf ("string is : %s\n", str);

    return 0;
}

输出:

string is : This Is A Test String

答案 3 :(得分:-1)

请尝试以下代码:。)

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

#define N   100

int main( void ) 
{
    char sentence[N];
    char *p = sentence; 

    printf( "Enter a sentence: " );

    if ( !fgets( sentence, sizeof( sentence ), stdin ) ) sentence[0] = '\0';

    printf( "\nThe given sentence is   : %s", sentence );

    do
    {
        while ( isblank( ( unsigned char )*p ) ) ++p;
        if ( islower( ( unsigned char )*p  ) ) *p = toupper( *p );
        while ( *p && !isblank( ( unsigned char )*p ) ) ++p;
    } while ( *p );

    printf( "\nCase changed sentence is: %s", sentence );   

    return 0;
}

输出

The given sentence is   : welcome to Sharif university

Case changed sentence is: Welcome To Sharif University

如果您的编译器不支持函数isblank,那么您可以将其替换为isspace

似乎更正确的方法是仅使用isalpha,因为在一般情况下,在空白后可以有例如数字或标点符号

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

#define N   100

int main( void ) 
{
    char sentence[N];
    char *p = sentence; 

    printf( "Enter a sentence: " );

    if ( !fgets( sentence, sizeof( sentence ), stdin ) ) sentence[0] = '\0';

    printf( "\nThe given sentence is   : %s", sentence );

    do
    {
        while ( *p && !isalpha( ( unsigned char )*p ) ) ++p;
        if ( islower( ( unsigned char )*p  ) ) *p = toupper( *p );
        while ( isalpha( ( unsigned char )*p ) ) ++p;
    } while ( *p );

    printf( "\nCase changed sentence is: %s", sentence );   

    return 0;
}

如果您不想更改原始字符串,则代码将如下所示

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

#define N   100

int main( void ) 
{
    char sentence[N];
    char *p = sentence; 

    printf( "Enter a sentence: " );

    if ( !fgets( sentence, sizeof( sentence ), stdin ) ) sentence[0] = '\0';

    printf( "\nThe given sentence is   : %s", sentence );

    printf( "\nCase changed sentence is: " );   
    do
    {
        while ( *p && !isalpha( ( unsigned char )*p ) ) putchar( *p++ );
        if ( islower( ( unsigned char )*p  ) ) putchar( toupper( *p++ ) );
        while ( isalpha( ( unsigned char )*p ) ) putchar( *p++ );
    } while ( *p );


    return 0;
}