【问题标题】:Can't convert lowercase to uppercase with pointer无法使用指针将小写字母转换为大写字母
【发布时间】:2016-04-21 07:08:55
【问题描述】:

所以我想用一个条件将小写字母变成大写字母,小写字母之前必须有空格,但问题是我不能 检查数组中的下一个字符(使用 +1)是否为空格。

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

void convertToUpper( char *array );

int main()
{   
   char x[] = "i believe i can do it";
   convertToUpper(x);
   printf("%s",x);

   return 0;
}

void convertToUpper( char *array )
{
   while( *array != '\0' )
   {        
       if( *( array + 1 ) != ' ' && *array == ' ' )
       {
           *( ++array) = toupper( *(array) );   
       }
      ++array;
   }
}

【问题讨论】:

  • if( *( array + 1 ) != ' ' &amp;&amp; *array == ' ' ) 逻辑?
  • 我想,这应该检查空格字符后跟非空格字符。但它实际上做了一些不同的事情,并且可能会收到越界
  • 您的意思是要大写单词吗?输出应该是:“I Believe I Can Do It”?
  • 我刚刚发现了错误!

标签: c arrays pointers toupper


【解决方案1】:

你只是转换了错误的字符,因为在你的条件下,*array 是空格,你应该转换它后面的字母:

while(*array != '\0')
{        
    if( *(array + 1) != ' ' && *array == ' ')
        *(array + 1) = toupper(*(array + 1));
    ++array;
}

这个简单的检查不适用于第一个字符,如果它也应该是大写,在循环之前添加以下内容:

if (*array != ' ')
    *array = toupper(*array)

【讨论】:

  • 是的,我也意识到了这一点
  • 如果您执行toupper,您可以通过将数组点增加两个来提高性能,否则会增加一个
  • @EdHeal 是的,没错,如果转换然后将指针提前两点会更好。
【解决方案2】:
void convertToUpper( char *array )
{
   while (  array[0] != 0) && (array[1] != 0) )
   {        
       if( (array[1] != ' ') && (array[0] == ' ' )
           array[1] = toupper( array[1] ); 
       ++array;
   }
}

【讨论】:

    【解决方案3】:

    这样会记住前一个字符

    char previous = ' ';
    while(*array != '\0') {        
        if(previous == ' ') {
            *array = toupper(*array);
        }
        previous = *array++;
    }
    

    在一个答案被接受之后,但我还是发布了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-04
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2013-07-26
      • 2022-01-16
      相关资源
      最近更新 更多