【问题标题】:How would you convert alpha characters to n string to uppercase in C? [closed]如何在 C 中将字母字符转换为 n 字符串为大写? [关闭]
【发布时间】:2017-12-13 16:44:09
【问题描述】:

这是我目前所拥有的。我只是想了解如何实现这个功能。

char toupper(char s[])
{
  s[50] = "hello";
  int i = 0;
  int len;
  len = strlen(s);

  while(i < len) //converting to upper until the length is reached.
   {
    s[i] = putchar(toupper(s[i]));
    i++;
   }
   return s[i];
}

【问题讨论】:

  • 对不起?不明白。你能说得更具体一点吗?
  • 将函数与库函数同名并不是一个好主意。
  • 为什么函数里面有s[50] = "hello";?这会覆盖传递给函数的任何内容
  • 当您尝试将字符串分配给可能超出范围也可能不超出范围的数组元素时,也无法正常工作。
  • 原来函数是用不同的语言定义的,我试图将其转换为 C。@ArunAS 我看到我确实需要更改名称,但我试图保持不变我正在转换它的名称。我确实添加了一个下划线来阐明该功能。

标签: c string toupper


【解决方案1】:

似乎 OP 想要将字符串转换为大写。现在在这里不知何故OP搞砸了分配部分。代码可以归结为将uppercase 字符分配给传递的字符串。

但是在这里,代码正在做一些编译器抱怨的事情。 invalid conversion from 'const char*' to 'char'。好吧,我们正在尝试将char* 分配给char,所以它抱怨了。整个代码可以简化,尽管很少有想法。我们将编写一个将字符串转换为全大写的模块。而已。然后我们将使用“hello”或一些字符串对其进行测试。

#include<stdio.h>
#include<ctype.h>
#include<string.h>
void toupperString(char s[])
{
  size_t len = strlen(s), i = 0;

  while(i < len) 
   {
    s[i] = toupper((unsigned char) s[i]);
    i++;
   }
}

int main(void) {
  char s[100];
  strcpy(s,"hello"); // char s[100]="hello" also works;
  toupperString(s);
  printf("%s\n",s );
  return 0;
} 

使用您的putchar 是正确的。因此,这将与添加的功能一起使用,它现在也将继续打印。 (你决定它是否是功能 - 因为除了打印它之外,它的用途不会那么有用 - 总是打印给 toupperString 的任何东西不是一个好主意)。

void toupperString(char s[])
{
  size_t len = strlen(s), i = 0;

  while(i < len) 
   {
    s[i] = toupper((unsigned char) putchar(s[i]));
    i++;
   }
}

您在该功能中也有一些可疑的用途。例如它的返回值。为什么要返回 \0 字符?需要吗?如果答案是否定的,那么只需将其设为 void 返回类型,表示您没有返回任何内容。此外,随着数组衰减为指针,char 数组将被更改,您无需执行任何操作即可返回它。因为您基本上是在修改原始字符数组。

好吧,我们可以像这样更简洁地写成

char* toupperString(char *s)
{
    char *p = s;
    while( *s) 
    {
        *s= toupper((unsigned char) *s);
        ++s;
    }
    return p;
}

【讨论】:

  • @chux.: 关于这个想法..它是 Bob__ 提醒我的,然后添加了它。
【解决方案2】:

您当前的功能具有您想要实现的基本前提,但存在许多问题。

首先,调用它toupper 无疑会让您头疼,因为您正在使用预先存在的toupper 函数来实现该函数。您的函数需要获取一个字符串,然后返回修改后的字符串,但现有的toupper 用于获取并返回单个char。从概念上讲,由于您正在修改传入的字符串,因此您不需要返回任何内容,但返回它并没有什么坏处。

其次,您打电话给putchar,原因不明。您可以忽略它,如果需要,在代码的后面部分打印更新的字符串。

第三,您将返回 s[i],它只是一个 char,并且鉴于 i 已增加,字符串的长度将指向终止 NUL 字符。

您还有虚假行s[50] = "hello";,它将传入字符串的第 51 个字符设置为某个值,该值不是“hello”中的任何字符,而是字符串“hello”的内存位置。如果您尝试将 s 声明为“hello”,您应该在我作为示例包含的调用函数中执行此操作。

int main(void)
{
  char s[]="hello";
  make_string_upper(s);
  printf("%s\n",s);
}

char *make_string_upper(char *s)
{
  int i = 0;
  int len = strlen(s);

  while(i < len) //converting to upper until the length is reached.
   {
    s[i] = toupper(s[i]);
    i++;
   }
   return s;
}

【讨论】:

  • 你已经说了所有我想评论的关于 OP 的代码,但我可以建议你摆脱对strlen 的调用吗?我觉得没用:ideone.com/5IlRo9
  • @Bob__ 不能不使用strlen,因为该函数正在返回字符串。
  • @ChrisTurner.: 对不起,克里斯……误解了
  • @coderredoc 你的函数版本不返回s 所以可以在没有strlen 的情况下实现
  • ideone.com/cEmO1d,加上在这种状态下,如果 strlen 返回 > INT_MAX,您的代码可以调用 UB。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 2019-12-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2020-10-16
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多