一直以来都是C和C++不分的混用(也主要是因为一直以来都没有写过什么程序。。。),今天在写一个反转输入字符串的小程序时,发现了格外多的bug,也着实学到了不少东西。起初是写的如下代码(片段):
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s = "jack is a good boy!";
printf("%s",s);
return 0;
}
刚开始都没有加以下语句:
#include <iostream>
using namespace std;
后来即使加上了,也于事无补,编译器仍然报错:
warning: cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime
这个警告真心看不懂,Google说是printf()无法识别string定义的s,printf()是C的函数,可以用printf("%s",str);来打印字符串,但是无法识别string变量,因为C中没有定义string!
string是C++中才有的。string是一个类,具体请看这里。所以以上程序段改成这样就可以运行了:
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s = "jack is a good boy!";
cout >> s >> endl;
return 0;
}
那么,才C中怎么操作字符串呢?先来一个出错的:
#include <stdio.h>
#include <string.h>
int main()
{
char s[100];
s[0] = "jack is a good boy!\n";
printf("%s",s);
return 0;
}
这个时候编译器会报错:
warning: assignment makes integer from pointer without a cast
(警告:未经剪切将指针变为了整型)在Google了一阵之后,我发现后半部分(即“jack.....”)是一个指针,而s[0]需要的,是一个整数,所以这样的赋值是错误的,对s[0]的赋值应该是如下这种样子的:
s[0] = 'a';
但是想要对字符数组整个赋值怎么办?有两种办法,在建立数组时即赋值,或者,建立一个指针*ss,见如下代码:
#include <stdio.h>
#include <string.h>
int main()
{
char s[100] = "jack is a good boy!\n";
char *ss;
ss = "jack is a bad boy!\n";
printf("%s",s);
printf("%s",ss);
return 0;
}
这样就可以正常实现了。
在百度知道里见到了如下一种解决办法,可行:
#include <stdio.h>
#include <string.h>
typedef char* string;
int main()
{
string ss;
ss = "jack is a bad boy!\n";
printf("%s",ss);
return 0;
}
就是通过语句
typedef char* string;
自己定义一个string,可以实现以上功能。