我正在学习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;
}
}
当我编译它时,没有问题。但是当我运行它时,没有任何反应。我无法找出问题所在!
答案 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 ) );