【问题标题】:Converting lowercase letters to uppercase将小写字母转换为大写字母
【发布时间】:2015-07-28 08:09:22
【问题描述】:

我有一个程序来反转字符串并将其转换为大写。如果我写helloworld!,输出一定是!DLROWOLLEH。但是如果我写hello world!,输出是!DLRO。你能告诉我可能的问题在哪里吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * reverse(const char * text)
{

if (text==NULL)
return NULL;

int length = strlen(text);
char * reversed_string = malloc(length+1);

for(int i = 0; i < length/2; ++i)
    {
        reversed_string[i] = text[(length-1) - i];
        reversed_string[(length-1) - i] = text[i];
    }

reversed_string[length] = '\0';

//upper(reversed_string);

return reversed_string;
}




void upper(char *str1)                                          
{
    while(*str1!='\0')                                                   
        {
            if(*str1>96&&*str1<123)                          
                *str1=*str1-32;                                     
        str1++;                                                        
        }
}

int main(int argc, char * argv[])
{
    char p[256];
    fgets(p, sizeof(p), stdin);

    char * rev_str = reverse(p);
    upper(rev_str);
    printf("%s\n", rev_str);

    rev_str = 0;
    return 0;
}

【问题讨论】:

  • 你真的在定义upper() inside reverse()???
  • @SouravGhosh 这是一个 gcc 扩展,因此它可能是有效代码,这是一个坏主意,实际上某些编程语言允许或鼓励它,我没有看到用例,但我害怕学过它的程序员。这样做的明显原因是外部函数的局部变量在内部函数中是可见的,这并不是说您不能将它们作为参数传递并对其进行任何您喜欢的操作,因此使用此技术意味着存在问题理解结构化编程,虽然它是一个非常复杂的结构
  • 是的,这是个大问题吗?
  • @iharob 最后一行是我试图表达的意思。 :-)
  • @JakubEliaš 这不是标准的,这是一个坏主意,糟糕的设计。

标签: c string uppercase lowercase


【解决方案1】:

问题来了

for(int i = 0; i < length/2; ++i)

length 是一个奇数(如您的示例中的 11),这将隐式向下舍入,因此,您永远不会写入字符串的中间元素。在你的情况下,这恰好是 0,但不能保证是这样,所以任何字符都可能出现在那里,而不是提前终止字符串。

最简单的解决方法是将其更改为(length+1)/2,但这会导致您编写中间元素两次

实际上,我认为如果你只是通过在一个方向而不是从两个方向迭代字符串来反转字符串会容易得多。

【讨论】:

  • 谢谢,您的解决方案 "(length+1)/2" 有效。再次感谢:)
【解决方案2】:

我已经修改了您的代码,它按预期工作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

char * reverse(const char * text)
{

    if (text==NULL)
        return NULL;

    unsigned long length = strlen(text);
    char * reversed_string = malloc(length+1);

    for(int i = 0; i < length; ++i)
    {
        reversed_string[i] = text[(length-1) - i];
        //reversed_string[(length-1) - i] = text[i];
    }

    reversed_string[length] = '\0';

    //upper(reversed_string);

    return reversed_string;
}




void upper(char *str1)
{
    while(*str1!='\0')
    {
        if(*str1>96&&*str1<123)
            *str1=*str1-32;
        str1++;
    }
}

int main(int argc, char * argv[])
{

    char p[256];
    fgets(p, sizeof(p), stdin);

    char * rev_str = reverse(p);
    printf("%s\n", rev_str);
    upper(rev_str);
    printf("%s\n", rev_str);

    rev_str = 0;

    return 0;
}

【讨论】: