是否可以确定字符串是否不能写在传递给char * string
的一侧?
我的代码:
#include <stdio.h>
typedef enum string_type
{ READ_ONLY, READ_WRITE }
String_type;
String_type isvalid(char *s);
void test(char *s){
if(isvalid(s))
printf("OK\n");
else
printf("NG\n");
}
int main(void){
char data_str[] = "data_str";
test("data_str");// fails
test(data_str);// works
return 0;
}
String_type isvalid(char *s){
//Can it be determined by this?
//I don't think this is a portable way.
return (void *)s > (void *)main ? READ_ONLY : READ_WRITE;
}
答案 0 :(得分:8)
是否可以确定字符串是否为“只读”?
没有标准化的方法来做到这一点。
即使在一个平台上,使用地址也可能会失败,因为链接器可以自由地将数据放置在他们(开发人员掌握它们)所需的位置。
<强>更新强>:
为了防止代码将文字传递给他们自己尝试修改传入的内存的函数,您可能希望针对代码运行静态源分析器。
用于此目的的一个好工具是splint
。
答案 1 :(得分:2)
完全随意,但也许你可以在你的平台上使它稳定。
#include <stdio.h>
#include <stdlib.h>
int isliteral(char *s) {
char *lit = "totally literal";
char nolit[] = "some";
return abs(nolit - s) > abs(lit - s) ;
}
int main(){
char sa[] = "not literal";
char *sl = "literal";
printf("%d\n", isliteral(sa));
printf("%d\n", isliteral(sl));
return 0;
}
给出:
0
1
答案 2 :(得分:0)
如果你想改变一个字符串我建议你创建一个字符串的副本,改变它,然后把它留给调用者他们想用它做什么。
char* change(char* original)
{
int len = strlen(original);
char* copy = new char[len + 1];
strcpy(copy, original);
copy[0] = 'H';
return copy;
}
int main()
{
char* data_str = "Bello world";
const char* first_changed = change(data_str);
const char* second_changed = change("Bello world");
cout << first_changed << endl;
cout << second_changed << endl;
delete[] first_changed;
delete[] second_changed;
return 0;
}
更好:使用std::string
并免除new
/ delete
字符数组的负担。
答案 3 :(得分:0)
常量是一个编译时概念,但是有一个异常是指针,因为c-string = char *所以有可能知道char *在运行时是否是只读的:
#include <iostream>
#include <typeinfo>
int main()
{
char * str1;
const char * str2 = "str2";
std::cout<<"char * : "<<typeid(str1).name()<<"\n";
std::cout<<"const char * : "<<typeid(str2).name()<<"\n";
system("pause");
}
输出是:
char * : Pc
const char * : PKc
Appuyez sur une touche pour continuer... // press any key to continue