【问题标题】:How to set a string to all lowercase [duplicate]如何将字符串设置为全部小写[重复]
【发布时间】:2013-05-30 08:17:28
【问题描述】:

我有一个char foo[SIZE]; //(string)

并已使用%s 正确输入(如printfs 中的正确输入),但现在想将其设置为小写。所以我尝试使用

 if (isupper(*foo)) 
   *foo=tolower(*foo); 

当我这样做时:

printf("%s" foo); //I get the same text with upper case

文本似乎没有改变。谢谢你。

【问题讨论】:

  • 您可以使用isalpha 删除非字母字符。
  • isuppertolower 仅适用于单个字符,而不适用于字符串。
  • @Yu Hao 所以没有办法将它应用到字符串?
  • 您需要使用for 来遍历字符串的每个字符,查看stackoverflow.com/questions/2661766/…

标签: c uppercase lowercase tolower toupper


【解决方案1】:

foo 不是指针,因此您不想将其用作指针。在使用tolower 之前,您也不必检查字符是否为大写字母——它将大写转换为小写,而其他字符保持不变。你可能想要这样的东西:

for (i=0; foo[i]; i++)
    foo[i] = tolower((unsigned char)foo[i]);

请注意,当您调用tolower(和toupperisalpha 等)时,您确实需要将输入转换为unsigned char。否则,基本英语/ASCII 字符集之外的许多(大多数?)字符将经常导致未定义的行为(例如,在典型情况下,大多数重音字符将显示为负数)。

顺便说一句,当您读取字符串时,您不想将scanf%s 一起使用——您总是希望指定字符串长度,例如:scanf("%19s", foo);,假设@987654331 @ == 20(即,您希望指定比大小小一。或者,您可以使用fgets,如fgets(foo, 20, infile);。请注意,使用fgets,您指定缓冲区的大小,而不是小一您可以使用 scanf(以及 fscanf 之类的公司)。

【讨论】:

  • +1 表示“aside....”部分
【解决方案2】:

试试这个

for(i = 0; foo[i]; i++){
  foo[i] = tolower(foo[i]);
}

【讨论】:

  • for 循环中间的 foo[i] 是什么意思?是不是像 i
  • @user2450044 你可以使用foo[i] != '\0',但不能使用i <'\0'
【解决方案3】:

*foo=tolower(*foo); //doing *(foo+i) or foo[i] does not work either

因为所有这些选项都没有意义

你应该这样使用它:

for(i = 0; foo[i] != '\0'; i++){
    foo[i] = tolower(foo[i]);
}

【讨论】:

  • 中间的 foo[i] 是什么意思?
  • NULL 或\0??我认为\0 更好,因为它是一个字符数组。
  • @Bill 你是对的。谢谢
  • 好的,现在为答案 +1 :)
  • @user2450044 曾经读过 C 中的 for 循环?认真做点努力吧……
猜你喜欢
  • 2010-09-14
  • 2010-09-22
  • 2018-06-04
  • 1970-01-01
  • 2016-08-14
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
相关资源
最近更新 更多