关于C语言打印string类字符串的问题

首先因为printf函数输出字符串是针对char *的,即printf只能输出c语言的内置数据,而string不是c语言的内置数据。

其次string类型的对象不止包含字符串,还包含了许多用于操作的函数,所以&str并非字符串的首地址

因此该怎么打印string字符串呢?

1、利用string的成员函数c_str()打印,如下:

string q = "123ABCD";
printf("%s", q.c_str());

2、强转,将string类型强转成char*类型,如下:

string q = "123ABCD";
char* a = (char*)q.data();
printf("%s", a);

3、对string类对象的实例进行赋值时所产生的问题

该问题参考该帖子

https://www.cnblogs.com/newzol/p/8686076.html

先看下面的图片

先看看所出现的问题吧!

1、声明了一个string实例,使用c_str()进行赋值后,可以正常输出c_str()的值,但是直接输出string实例的实现,实际是空字符串

2、在第一个问题后,对string实例进行字符串追加,然后对string和c_str()进行输出.原来对字符串变量被覆盖了.

原因是什么呢?

_str()接口是string类的一个函数,返回的是字符串的首地址,返回值类型是const char *的.如果要使用它并对其进行赋值操作,必须要使用strcpy函数.如果哦直接进行赋值,是不会赋值成功的.(小

知识:const char *是指向常量字符串的指针.)

在string类中.c_str()的生命周期受到string类实例的影响.如果我们使用string对象实例进行赋值,字符串被复制到一个char*的成员变量,然后在调用c_str()的时候,会直接返回string类中维护的

char*成员的首地址.这样也就能保证了使用string和c_str()都能输出想要的字符值.

但是,在ddemo中,先使用strcpy对const char *进行强转,然后进行赋值.虽然可以正常打印,但是对string对象中维护的成员没有正确的维护.所以,当进程再次使用string对象进行赋值时.新对字符

串会覆盖老的字符串.使用c_str()打印的时候也是新的char*成员指向的地址.这样也就解释了在使用append对实例赋值时,后面打印的结果是追加字符串的值.

其实,前面说的都是废话,用一句话就可以说明,就是:在使用string中的c_str()进行字符串赋值时,如果后面对string中的char*进行改变.那么c_str()中的值就不在可靠了.

原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10801784.html

时间: 2024-10-04 16:48:47

关于C语言打印string类字符串的问题的相关文章

c++ --> string类字符串

一.string类字符串的介绍 在程序设计中, 字符串的使用十分频繁, C语言类型字符串(简称C-串)在使用与字符串的处理上较为复杂, C++为了在程序设计中更加方便的使用字符串特新增了一种string类型的字符串. string类字符串为STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型, 相对于C-串来说string类型串具有一些明显的优势, 首先, 它在内存使用上是自动的, 需要多少, 开辟多少, 并且能够根据字符串大小的变化自动调整所开辟的

C++ String类字符串操作

string类的构造函数: string(const char *s);     //用c字符串s初始化 string(int n,char c);      //用n个字符c初始化 此外,string类还支持默认构造函数和复制构造函数,如string s1:string s2="hello":都是正确的写法.当构造的string太长而无法表达时会抛出length_error异常 string类的字符操作: const char &operator[](int n)const;

《java入门》第一季之类(String类字符串一旦被赋值就没法改变)

毫无疑问,String类是java里面最重要的类之一.因此它有很多方法需要了解和掌握. 字符串一旦被赋值,值就不能发生改变: package cn.itcast_02; /* * 字符串的特点:一旦被赋值,就不能改变. */ public class StringDemo { public static void main(String[] args) { String s = "hello";//hello是在字符串常量池中待着的.赋值hello后就没法在改变了. s += &quo

萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的ASCII码是否处于0~127之间,如果是就提取一个字符,否则提取两个.在测试分字效果的时候,这种方法出了问题.比如我传一个"abcde一二三四五"进去,abcde可以正常分解成 a b c d e,而后面的"一二三四五"则成了乱码. 于是我开启了谷歌之旅,搜索"

java String类-字符串常见操作

/* String常见的操作: String str="abchgthujidfg"; 1,获取 1.1字符串包含的字符数,即字符串的长度. int lenrth(): str.length();   //注意字符串获取长度的方法区别于数组获取长度的方法.数组采用格式:arr.length 1.2根据位置获取位置上的字符. char charAt(int index): str.charAt(4); 1.3根据字符获取该字符的位置. int indexOf(int ch): str.i

java中的String类 字符串拆分成字符串数组 判定邮箱地址 字符串比较 看结果?

看结果1? package com.swift; class ArrayString { public static void main(String[] args) { String str = "swift:30|sunny:28|Ben:32"; String str1[] = str.split("\\|"); for (int i = 0; i <= str1.length - 1; i++) { String str2[] = str1[i].sp

java String类字符串

字符串会放到字符串常量值=池,因此变量名不同,字符串相同,可以看作同一个对象如果new一个字符串,则不是同一个对象 比较:.equals()在String里面比较的是对象的内容,==在String里面比较的是对象地址 String s=" adawDawd "; String s2="adawwq"; System.out.println(s.charAt(4)); //提取下标为3的字符 System.out.println(s.length()); System

C语言打印最长字符串

编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词. char p[1000];    printf("请输入字符串:");    fgets(p, 1000, stdin);    int i = 0;       int high = 0;    int low = 0;    int low_temp = 0;    int high_temp = 0;    int count = 0;    int temp = 0;    for (i =

String类--字符串截取操作

运行结果:书中自有黄金屋 书中自有颜如玉 substring--方便将所要的字符串进行截取!!