2011-12-17 45 views
0

假设我们有char *a ="Mission Impossible";简单的字符串操作

如果我们给cout<<*(a+1),则输出为i

有没有办法改变这个值,这是不可能的?

+1

第一,它必须是'为const char * A =“使命可能”' 你期望的输出是什么?你想改变什么? – balki 2011-12-17 19:30:55

+1

你可以在整个地方改变很多值,但你确实需要更具体才能获得明智的结果。 – 2011-12-17 19:33:52

+0

“更改此值”是什么意思? – 2011-12-17 20:51:18

回答

2

是的,有几种方法可以做到这一点,但你必须做字符串拷贝第一,因为如果你没有,你会修改内存你不能(存储字符串文字哪里)。

const char* a = "Mission Impossible"; // const char*, not char*, because we can't 
             // modify its contents 
char buf[80] = {}; // create an array of chars 80 large, all initialised to 0 
strncpy(buf, a, 79); // copy up to 79 characters from a to buf 

cout << *(buf + 1); // prints i 

buf[1] = 'b'; 

cout << *(buf + 1); // prints b 

*(buf + 1) = 't'; 

cout << buf[1]; // prints t 

也就是说,如果这项工作不适合学习的目的,强烈建议您学习和使用std::string而不是C风格的字符串。几乎在任何情况下它们都优越,并且会导致代码中的挫败感和错误少得多。

0

改变这种最简单的方法是做*(a+1)='value_you_want';

这将改变指针的内容(你的情况下,指针是一个+ 1)您设置的值。

+0

我想你是指'*(a + 1)'? – fge 2011-12-17 19:29:49

+0

@fge不是应该修改指针的内容吗?如果没有,那么这就是我的意思:) – 2011-12-17 19:31:00

+2

这将工作,如果数据肯定是可变的;如果它可能是像这样的字符串常量,那不是一个好主意。 – 2011-12-17 19:31:03

1

没有,char* a实际上是只读的,如果你试图修改的内容,你会得到不确定的行为。理想情况下,您应该声明aconst char*

+0

和现代编译器甚至会在此代码上发出警告 – Lol4t0 2011-12-17 19:33:21

2
char a[] = "Mission Impossible"; 

a[1] = 'x'; 

字符串文字不能修改。通常情况下,它们会放置一部分二进制文件,这些文件将被映射为只读文件,因此写入它们会产生错误。 (这是实现定义的行为,但这种情况是最常见的实现,这些天。)

通过声明字符串的字符数组它是可写的。另一替代方案将是重复的字符串文字到堆存储器,无论是通过mallocnew,或std::string