这个例子在迪特尔" C:如何编程"书?

时间:2017-11-30 14:48:01

标签: c string pointers uppercase

我正在学习C:如何通过迪特尔进行编程。在Pointers一章中,有一个示例代码:

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

void convertToUppercase(char *sPtr);

int main( void )
{
    char string[] = "cHaRaCters and $32.98";
    printf( "The string before conversion is: %s", string );
    convertToUppercase( string );
    printf( "\nThe string after conversion is: %s\n", string );
}

void convertToUppercase(char *sPtr)
{
    while(*sPtr != '\0') {
        *sPtr = toupper(*sPtr);
        ++*sPtr;
    }
}

当我编译它时,没有问题。但是当我运行它时,没有任何反应。我无法找出问题所在!

2 个答案:

答案 0 :(得分:6)

您需要将指针增加而不是将值++*sPtr增加到++sPtr

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

void convertToUppercase(char *sPtr);

int main( void )
{
    char string[] = "cHaRaCters and $32.98";
    printf( "The string before conversion is: %s", string );
    convertToUppercase( string );
    printf( "\nThe string after conversion is: %s\n", string );
}

void convertToUppercase(char *sPtr)
{
    while(*sPtr != '\0') {
        *sPtr = toupper(*sPtr);
        ++sPtr;
    }
}

答案 1 :(得分:2)

功能中有拼写错误

void convertToUppercase(char *sPtr)
{
    while(*sPtr != '\0') {
        *sPtr = toupper(*sPtr);
        ++*sPtr;
        ^^^^^^^^
    }
}

相反,必须有

        ++sPtr;
        ^^^^^^^

此表达式++*sPtr递增指针sPtr指向的字符,而此表达式++sPtr递增指针本身。

然而,代码有几个缺点。

C标准中有一个字符串函数的约定,它们应该返回指向目标字符串的指针。因此,声明像

这样的函数会更好
char * convertToUppercase(char *sPtr);

函数toupper也依赖于它的参数可以表示为无符号字符。

来自C标准(7.4字符处理)

  

1标题声明了几个有用的函数   分类和映射字符.198)在所有情况下,参数都是   一个int,其值应表示为unsigned char   或者等于宏EOF的值。如果参数有任何   其他值,行为未定义。

所以编写

会更正确
        *sPtr = toupper( ( unsigned char )*sPtr);

在这种情况下,for循环比while循环更合适。

考虑到所有这些因素,可以通过以下方式实现该功能

char * convertToUppercase(char *sPtr)
{
    for ( char *p = sPtr; *p != '\0'; ++p ) {
        *p = toupper( ( unsigned char )*p );
    }

    return sPtr;
}

并调用

printf( "\nThe string after conversion is: %s\n", convertToUppercase( string ) );