Dietel 的“C:如何编程”一书中的这个例子有什么问题?

MMM

我正在学习 C: How to program by Dietel。在指针章节中,有这个示例代码:

#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;
    }
}

当我编译它时,没有问题。但是当我运行它时,什么也没有发生。我不知道是什么问题!

来自莫斯科的弗拉德

函数中有错别字

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,其值应表示为无符号字符或应等于宏 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 ) );

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

书中的这个例子不好吗?

来自分类Dev

《专家C编程》一书中的内存分配练习

来自分类Dev

这个C代码有什么问题?

来自分类Dev

为什么有必要打破这个例子?

来自分类Dev

了解“ Ruby编程”一书中的“方法”

来自分类Dev

这个长生不老药地图的例子有什么问题?

来自分类Dev

为什么无法成功解释从《 Haskell中的函数编程》一书中复制的haskell代码?

来自分类Dev

代码有什么问题?Horstmann书中的第一个代码示例

来自分类Dev

这个 mysql 游标有什么问题,如何纠正?

来自分类Dev

这个C代码行有什么问题

来自分类Dev

这个简单的C ++函数有什么问题?

来自分类Dev

这个反向数组代码在c ++中有什么问题?

来自分类Dev

这个C代码片段有什么问题?

来自分类Dev

这个简单的#define C代码有什么问题?

来自分类Dev

这个简单的代码(目标c)有什么问题?

来自分类Dev

这个C ++链表代码有什么问题?

来自分类Dev

这个C代码(链表实现)有什么问题?

来自分类Dev

这个C程序,文件读取有什么问题?

来自分类Dev

这个使用销毁的c ++代码有什么问题?

来自分类Dev

这个 C 代码有什么问题?孩子不回来?

来自分类Dev

C# WPF 这个模板有什么问题?

来自分类Dev

这个 c++ 模板函数有什么问题

来自分类Dev

有人能帮我找出这个 Java 编程有什么问题吗

来自分类Dev

在java中返回try-catch的finally块。这个例子有什么好处吗?

来自分类Dev

为什么在这个例子中我会收到带有 argv 的崩溃报告?

来自分类Dev

为什么在这个例子中最后一个孩子不工作?

来自分类Dev

这个GStreamer管道有什么问题?

来自分类Dev

这个Bison语法有什么问题?

来自分类Dev

这个Gradle语法有什么问题?

Related 相关文章

  1. 1

    书中的这个例子不好吗?

  2. 2

    《专家C编程》一书中的内存分配练习

  3. 3

    这个C代码有什么问题?

  4. 4

    为什么有必要打破这个例子?

  5. 5

    了解“ Ruby编程”一书中的“方法”

  6. 6

    这个长生不老药地图的例子有什么问题?

  7. 7

    为什么无法成功解释从《 Haskell中的函数编程》一书中复制的haskell代码?

  8. 8

    代码有什么问题?Horstmann书中的第一个代码示例

  9. 9

    这个 mysql 游标有什么问题,如何纠正?

  10. 10

    这个C代码行有什么问题

  11. 11

    这个简单的C ++函数有什么问题?

  12. 12

    这个反向数组代码在c ++中有什么问题?

  13. 13

    这个C代码片段有什么问题?

  14. 14

    这个简单的#define C代码有什么问题?

  15. 15

    这个简单的代码(目标c)有什么问题?

  16. 16

    这个C ++链表代码有什么问题?

  17. 17

    这个C代码(链表实现)有什么问题?

  18. 18

    这个C程序,文件读取有什么问题?

  19. 19

    这个使用销毁的c ++代码有什么问题?

  20. 20

    这个 C 代码有什么问题?孩子不回来?

  21. 21

    C# WPF 这个模板有什么问题?

  22. 22

    这个 c++ 模板函数有什么问题

  23. 23

    有人能帮我找出这个 Java 编程有什么问题吗

  24. 24

    在java中返回try-catch的finally块。这个例子有什么好处吗?

  25. 25

    为什么在这个例子中我会收到带有 argv 的崩溃报告?

  26. 26

    为什么在这个例子中最后一个孩子不工作?

  27. 27

    这个GStreamer管道有什么问题?

  28. 28

    这个Bison语法有什么问题?

  29. 29

    这个Gradle语法有什么问题?

热门标签

归档