如何在C中将字符串(char*)转换为大写或小写
我有一个结构:如何在C中将字符串(char*)转换为大写或小写,c,pointers,char,tolower,toupper,C,Pointers,Char,Tolower,Toupper,我有一个结构: typedef struct entry { char *surname; int house_no; char *postcode; } BEntry; 以及将字符串转换为大写的函数: void toUpper(char *str){ while (*str != '\0') { *str = toupper(*str); str++; } } mentry->surname = "bob"; mentry-&g
typedef struct entry {
char *surname;
int house_no;
char *postcode;
} BEntry;
以及将字符串转换为大写的函数:
void toUpper(char *str){
while (*str != '\0')
{
*str = toupper(*str);
str++;
}
}
mentry->surname = "bob";
mentry->house_no = 17;
mentry->postcode = "GK116BY";
toUpper(me->surname);
在我的主函数中,我为结构成员赋值,并希望将姓氏转换为大写:
void toUpper(char *str){
while (*str != '\0')
{
*str = toupper(*str);
str++;
}
}
mentry->surname = "bob";
mentry->house_no = 17;
mentry->postcode = "GK116BY";
toUpper(me->surname);
通过向这样的函数传递char指针,将字符串转换为大写的正确方法是什么?我的程序返回一个分段错误。非常感谢您的帮助。您的toUpper()
实现应该可以正常工作。但是,您应该注意来自编译器的警告(或者如果没有得到任何警告级别,则提高警告级别——当您将字符串文字分配给char*
这样的字符串时,您应该会看到一些东西)。字符串文字是常量,即不能修改。当您尝试写入它们时,这将导致您看到的分段错误
你需要像这样的东西:
mentry->surname = malloc(4);
strcpy(mentry->surname, "bob");
或者更方便,但不是C标准方式的一部分:
mentry->surname = strdup("bob");
当然,以后一定要调用
free()。复制字符串文字:
hw = strdup("Hello, World!");
或者声明一个char[]
变量并将其初始化为字符串文本。作为一种特殊情况,以这种方式使用的字符串文本是可写的:
char hw[] = "Hello, World!";
将c中的char*
转换为小写或大写的最简单方法是使用strdup
#include <string.h>
char *to_uppercase(char *s)
{
int i = 0;
char *str = strdup(s);
while (str[i])
{
if (str[i] >= 97 && str[i] <= 122)
str[i] -= 32;
i++;
}
return (str);
}
#包括
char*到_大写字母(char*s)
{
int i=0;
char*str=strdup(s);
while(str[i])
{
如果(str[i]>=97&&str[i]您所拥有的有什么问题?“bob”
是只读位置中的字符串文字。您无法修改它。请复制并修改它。问题是“bob
--一个常量字符串--指向姓氏
,其类型为char*
。您至少应该得到一个警告,表明您忽略了赋值中的常量。始终使用完整警告。解决此问题的一种方法是运行char*strdup(const char s)
作为作业的一部分。然后你会得到可以修改的“char*”。完成后别忘了释放内存。文字是不可写的,在第二种情况下,你会发现可写的不是文字,而是hw
@alk的内容,因为它不是文字;我知道。我在这张幻灯片中写下了答案这是一种不正确的方式,因为它比正确的版本更容易理解和表达。在这两种情况下,“Hello,World!”
都是一个文本。在这两种情况下,它都是不可写的。@alk从技术上讲是的,但这是一种特殊情况,字符串文本的内容隐式初始化数组(参考ISO 9899:2011§6.7.9.14)。从程序员的角度看,字符串文字实际上是可写的。我知道这不太正确,但更容易理解。字符串文字在C中不是const
。我认为标准中这样定义它是错误的,但不幸的是,它是这样。因此OP不会得到警告。在gcc中,您可以强制警告f或者是-Wwrite strings
,在这种情况下,程序违反了标准,但这样做更好。@tristopia:我想肯定是这样,但我看了一下,你完全正确。它确实说修改它们是未定义的行为,这就引出了一个问题,为什么它们不是…但是是的,所以没有明显的警告那好吧。