【问题标题】:What is wrong with this example in Dietel's "C: How to Program" book? [closed]Dietel 的“C:如何编程”一书中的这个例子有什么问题? [关闭]
【发布时间】:2017-11-30 14:48:01
【问题描述】:

我正在学习 Dietel 的 C:如何编程。在指针章节中,有这个示例代码:

#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 是学习调试。 SO 不是调试器。
  • ++*sPtr 试试++sPtr
  • @Ôrel 好点。和书中的代码一样吗?那我建议把它扔掉,再拿一个没有错别字的。
  • "当我运行它时,什么也没有发生" 似乎只是这样。应该会发生很多事情(您可以在调试器中看到这一点)。根据输入(第一个字符 z),它可以无限循环。如果您等待的时间足够长,您可能会注意到 CPU 冷却器的巨大噪音...

标签: c string pointers uppercase


【解决方案1】:

您需要增加指针而不是值将++*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;
    }
}

【讨论】:

  • 感谢您的宝贵时间和回答。我再次检查了这本书,发现我写错了。
【解决方案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,其值应表示为无符号字符 or 应该等于宏 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 ) );

【讨论】:

  • 非常感谢您快速清晰的回答。
  • @MiladSoltani 完全没有。不客气。:)
  • 顺便说一句,我再次检查了这本书。我做了类型,在书中它是正确的。
  • @MiladSoltani 无论如何,有人打错了。:)
猜你喜欢
  • 1970-01-01
  • 2016-10-20
  • 2016-06-21
  • 1970-01-01
  • 2014-08-22
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多