const char* s1 = "teststirg";
const char s2[] = "teststirg";
Run Code Online (Sandbox Code Playgroud)
我想要一个方法告诉我s1是"char*"而s2是"char []",如何编写方法?
谁能解释一下这段代码中发生了什么?
#include <stdio.h>
void f(const char * str) {
printf("%d\n", str[4]);
}
int main() {
f("\x03""www""\x01""a""\x02""pl");
f("\x03www\x01a\x02pl");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么是输出?
1
26
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种干净简单的方法来从 Python 中的文件或类文件对象读取以空字符结尾的 C 字符串。以一种不会从文件中消耗比它需要更多的输入的方式,或者将它推回到它所使用的任何文件/缓冲区,以便其他代码可以在以空字符结尾的字符串之后立即读取数据。
我已经看到了一些相当丑陋的代码来做到这一点,但我想使用的代码并不多。
通用换行支持仅适用于open()ed 文件,不适用于 StringIO 对象等,并且看起来不像处理非常规换行。此外,如果它确实有效,则会导致\n附加的字符串,这是不可取的。
struct 看起来根本不支持读取任意长度的 C 字符串,需要将长度作为格式的一部分。
ctypes has c_buffer,它可以从一个字节字符串构造,并将返回第一个空终止字符串作为它的value. 同样,这需要提前确定必须读取多少内容,并且不区分以空字符结尾的字符串和未结尾的字符串。也是如此c_char_p。所以它似乎没有多大帮助,因为你已经知道你已经阅读了足够多的字符串并且必须处理缓冲区拆分。
在 C 中执行此操作的常用方法是将块读取到缓冲区中,如果需要,复制并调整缓冲区大小,然后检查最新读取的块是否包含空字节。如果是,则返回空字节之前的所有内容并重新对齐缓冲区,或者如果您喜欢,请继续阅读并将其用作环形缓冲区。(当然,这仅在您可以将读取的多余数据交给调用者时才有效,或者如果您的平台ungetc允许将大量数据推回到文件中。)
是否有必要在 Python 中拼出类似的代码?我很惊讶没有发现任何罐头io,ctypes或者struct。
文件对象似乎没有办法推回到它们的缓冲区,比如ungetc,io模块中的缓冲 I/O 流也没有。
我觉得我一定错过了这里显而易见的东西。我真的宁愿避免逐字节读取:
def readcstr(f):
buf = bytearray()
while True:
b = f.read(1)
if b is None or b == '\0':
return str(buf)
else:
buf.append(b)
Run Code Online (Sandbox Code Playgroud)
但现在这就是我正在做的。
自从我用 C 编程以来已经有很多年了,所以我一直在努力做一个简单的“从标准输入获取文件名和路径,读取文件,将文件打印到标准输出”任务,我知道这不应该那么难但是你。这是我的代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void) {
int c;
FILE *file;
//scanf("%s", filename);
char *filename;
filename = (char *)malloc(200 * sizeof(char));
read(STDIN_FILENO, filename, 200);
printf("%s", filename);
file = fopen(filename, "r");
if (file) {
while ((c = getc(file)) != EOF)
putchar(c);
fclose(file);
} else {
printf("File not found.");
}
printf("\n");
return(0);
}
Run Code Online (Sandbox Code Playgroud)
我的代码继续简单地打印出来File not found.,当我知道我的文件路径并且一切都是正确的(不仅因为我真的把它从我的文件夹中删除并通过 Mac OSX El Capitan 将它传递到终端 - 多么可爱的功能,但是也)因为我有这个程序的不同版本,它使用scanf它找到了文件并完全正确地读取它,(正如你所看到的,我在我的代码中注释掉了它)。
我正在编写另一个程序,它只是使用这个程序,我摆脱了它,scanf因为我认为它对该程序中的其他事物产生了负面影响,所以我希望能够使用read()
如果有人对我如何解决这个问题或为什么这不起作用有任何建议,那将不胜感激,因为我已经在这里工作了几个小时,并且非常想继续我需要的实际程序代码!
感谢一堆
鉴于变量:
var1 db "abcdefg", NULL
Run Code Online (Sandbox Code Playgroud)
我将如何执行循环来导航每个字母?在 C++ 中,您会在循环内执行类似 var[x] 的操作,然后每次都增加 x。有任何想法吗?
使用 CString 库函数从主字符串复制子字符串。
CString FilterCriteria ="MESSAGE=2 AND READ = 2 AND Instance=\'SMS/MMS\'
AND Folder=\'inbox\'";
CString o_filter;
Run Code Online (Sandbox Code Playgroud)
现在,我想Instance=\'SMS/MMS\' AND Folder=\'inbox\'从复制FilterCriteria到o_filteredFilterCriteria。
预期结果:
o_filter = Instance=\'SMS/MMS\' AND Folder=\'inbox\'.
Run Code Online (Sandbox Code Playgroud)
程序:
int Pos = FilterCriteria.find(instance);
int First_Pos = FilterCriteria.find("'");
string temp_str = FilterCriteria.substr(First_Pos+1);
string temp_str =FilterCriteria.
int Second_Pos = temp_str.find("'");
string tempInstance = FilterCriteria.substr(Pos, First_Pos+Second_Pos-
Pos+2);
temp_str = "";
Pos = FilterCriteria.find(folder);// folder position
string Fold_Str = FilterCriteria.substr(Pos);//string after the folder
First_Pos = Fold_Str.find("'");// first occurence of string
temp_str …Run Code Online (Sandbox Code Playgroud) 说我有这样的事情
extern "C" void make_foo (char** tgt) {
*tgt = (char*) malloc(4*sizeof(char));
strncpy(*tgt, "foo", 4);
}
int main() {
char* foo;
make_foo(&foo);
std::string foos{{foo}};
free(foo);
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想避免使用然后删除foo缓冲区。即,我想将初始化更改为foos类似
std::string foos{{std::move(foo)}};
Run Code Online (Sandbox Code Playgroud)
并且不使用显式free.
事实证明这实际上可以编译并且似乎可以工作,但我对此有一种相当怀疑的感觉:它是否真的移动了 C 定义的字符串并正确释放了存储?或者,std::move一旦foo指针超出范围,它是否只是忽略并泄漏存储?
并不是我太担心额外的副本,但我确实想知道是否有可能以现代移动语义风格来编写它。
我应该如何编写一个高效的异常类来显示可以通过在运行时修复源代码错误来防止的错误?
这就是我选择的原因std::invalid_argument。
我的异常类(显然不起作用):
class Foo_Exception : public std::invalid_argument
{
private:
std::string Exception_Msg;
public:
explicit Foo_Exception( const std::string& what_arg );
virtual const char* what( ) const throw( );
};
explicit Foo_Exception::Foo_Exception( const std::string& what_arg ) // how should I write this function???
{
Exception_Msg.reserve( 130000 );
Exception_Msg = "A string literal to be appended, ";
Exception_Msg += std::to_string( /* a constexpr int */ );
Exception_Msg += /* a char from a const unordered_set<char> */;
}
const char* Foo_Exception::what( ) …Run Code Online (Sandbox Code Playgroud) 如果我捕获异常,我想将错误消息(该方法以 C 样式字符串形式返回)转换what()为std::u8string(UTF-8 字符串)。例如:std::u8string(error.what());
如何将 a 转换char*为 a std::u8string?