[英]Replacing character within string
这是一个非常基本的问题,已经被问了很多,但是我看过的所有示例都略有不同
#include<stdio.h>
int main() {
char title[] = "HELLO!";
title[1] = "F";
printf("%s", title);
}
为什么这会导致以下错误-
jdoodle.c:6:14: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
title[1] = "F";
干杯
它需要像这样:
#include<stdio.h>
int main() {
char title[] = "HELLO!";
title[1] = 'F';
printf("%s", title);
}
'F'
是一个字符,它与作为字符串的"F"
。 永远记住,字符串是字符数组。
"F"
是字符串文字。 它的类型为char[2]
(也就是说,它是一个包含字符串的字符数组),并且在内存中的显示方式如下:
char unnamed_literal[] = { 'F', '\0' };
根据C标准(6.4.5字符串文字)
6在转换阶段7中,将一个或多个字符串文字产生的每个多字节字符序列附加一个零值的字节或代码 。78) 然后将多字节字符序列用于初始化一个静态存储持续时间和长度足够的数组包含序列。 对于字符串文字,数组元素的类型为char,并使用多字节字符序列的各个字节进行初始化...
例如,尝试执行此语句
printf( "%zu\n", sizeof( "F" ) );
在此表达声明中
title[1] = "F";
左操作数的类型为char
而右操作数的类型为char[2]
隐式转换为指向其第一个元素char *
指针。
来自C标准(6.3.2.1左值,数组和函数指示符)
3除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“ array of type”的表达式将转换为类型为“ pointer”的表达式键入'',它指向数组对象的初始元素,不是左值。 如果数组对象具有寄存器存储类,则该行为是不确定的。
所以在这句话
jdoodle.c:6:14:警告:赋值从指针进行整数转换而无需强制转换
试图将字符串文字的第一个字符的地址分配给没有意义的字符。
显然,您的意思是将字符常量'F'
分配给char
类型的对象title[1]
。
那是你的意思是下面的陈述
title[1] = 'F';
您可以使用字符串文字,但需要其第一个字符而不是其地址。 你可以写例如
title[1] = "F"[0];
要么
title[1] = *"F";
甚至喜欢
title[1] = 0["F"];
但是,当然,使用字符常量代替字符串文字会更好,更简单
title[1] = 'F';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.