我的代码段错误,我不知道为什么.
1 #include <stdio.h>
2
3 void overwrite(char str[], char x) {
4 int i;
5 for (i = 0; str[i] != '\0'; i++)
6 str[i] = x;
7 }
8
9 int main(void) {
10 char *s = "abcde";
11 char x = 'X';
12 overwrite(s, x);
13 printf("%s\n", s);
14 return 0;
15 }
Run Code Online (Sandbox Code Playgroud)
gdb调试器告诉我,问题出在第6行,我想将一个char存储到c-string中(如果我使用左值指针解除引用,那就是同样的问题.)这就是他所说的:
(gdb) run
Starting program: /tmp/x/x
Breakpoint 1, overwrite (str=0x8048500 "abcde", x=88 'X') at x.c:5
5 for (i = 0; str[i] != '\0'; i++) …Run Code Online (Sandbox Code Playgroud) 我想在.c文件中写一些.txt文件,但需要用当前时间戳作为后缀来命名该文件,就像filename_2010_08_19_20_30一样.所以我必须首先定义文件名char数组并自己处理文件名?逐个分配字符?
有没有简单的方法呢?
有没有一种正确的方法来调用一个char数组和一个char指针来转到一个函数,但它是通过引用传递的,它也将被操作?
像这样的东西:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void manipulateStrings(char *string1, char *string2[])
{
strcpy (string1, "Apple");
strcpy (string2, "Banana");
printf ("2 string1: %s", string1);
printf ("2 string2: %s", &string2);
}
int main ()
{
char *stringA;
char stringB[1024];
stringA = (char *) malloc ( 1024 + 1 );
strcpy (stringA, "Alpha");
strcpy (stringB, "Bravo");
printf ("1 stringA: %s", stringA);
printf ("1 stringB: %s", stringB);
manipulateStrings(stringA, stringB);
printf ("3 stringA: %s", stringA);
printf ("3 stringB: %s", stringB);
return 0;
} …Run Code Online (Sandbox Code Playgroud) 在Phobos中是否有一个函数用于将零终止字符串转换为D字符串?
到目前为止,我只发现了相反的情况toStringz.
我在下面的代码片段中需要这个
// Lookup user name from user id
passwd pw;
passwd* pw_ret;
immutable size_t bufsize = 16384;
char* buf = cast(char*)core.stdc.stdlib.malloc(bufsize);
getpwuid_r(stat.st_uid, &pw, buf, bufsize, &pw_ret);
if (pw_ret != null) {
// TODO: The following loop maybe can be replace by some Phobos function?
size_t n = 0;
string name;
while (pw.pw_name[n] != 0) {
name ~= pw.pw_name[n];
n++;
}
writeln(name);
}
core.stdc.stdlib.free(buf);
Run Code Online (Sandbox Code Playgroud)
我用它来查找用户ID的用户名.
我现在假设UTF-8兼容性.
我想知道你是否可以使用变量来指定字段宽度,例如:
float g = 123.4567;
int x = 3;
int y = 4;
printf("%(%d).(%d)f", x,y,g);
Run Code Online (Sandbox Code Playgroud)
我希望我的输出为:"123.4567",基本相同
printf("%3.4f");
Run Code Online (Sandbox Code Playgroud)
我不认为编译器会读取当前格式,但也许还有另一种方法.
我需要尽可能快的lastIndexOf实现.我发现字符串高级功能非常慢.我尝试使用c函数strrchr,并尝试将字符串复制到NSData并使用指针,但我无法正确使用语法.我的字符串将始终有1个字节的字符和我正在搜索"|"的字符串 也总是1个字节.
任何使用advance的实现都会太慢,但这是我能找到的最快的例子:
func indexOf(target: String, startIndex: Int) -> Int
{
var startRange = advance(self.startIndex, startIndex)
var range = self.rangeOfString(target, options: NSStringCompareOptions.LiteralSearch, range: Range<String.Index>(start: startRange, end: self.endIndex))
if let range = range {
return distance(self.startIndex, range.startIndex)
} else {
return -1
}
}
func lastIndexOf(target: String) -> Int
{
var index = -1
var stepIndex = self.indexOf(target)
while stepIndex > -1
{
index = stepIndex
if stepIndex + target.length < self.length
{
stepIndex = indexOf(target, startIndex: stepIndex + target.length)
} …Run Code Online (Sandbox Code Playgroud) 在阅读了这个问题之后:长度为前缀的字符串克服的零终止字符串有什么问题?我开始想知道,究竟是什么阻止了C实现为堆栈或堆上分配的任何char或wchar_t数组分配一些额外的字节,并使用它们作为"字符串前缀"来存储N其元素的数量?
然后,如果N-th字符是'\0',则N - 1表示字符串长度.
我相信这可以极大地提升诸如strlen或等功能的性能strcat.
如果程序广泛使用非0终结char数组,这可能会转向额外的内存消耗,但这可以通过编译器标志打开或关闭'\0'编译代码的常规"计数直到达到"例程来解决.
这种实施有哪些障碍?C标准是否允许这样做?这项技术会导致我没有考虑到哪些问题?
并且......实际上有没有这样做过?
c compiler-construction c-strings null-terminated compiler-optimization
我想找出为什么比较功能没有给我正确的结果?
据我所知,如果两个字符串相同,则应该返回0!
bool validatePassword(char id[], string password) {
// cannot be the same as the id string
if(password.compare(id) == 0) {
cout << "password can not be as same as id\n";
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud) 这里我有一个动态分配的c字符串数组.
释放这样一个数组的正确方法是什么?
有必要单独释放每个元素A,如下面的代码?
谢谢.
#include <string.h>
int main()
{
const char** A = new const char*[3];
A[0] = (const char*)memcpy(new char[5], "str0", 5);
A[1] = (const char*)memcpy(new char[5], "str1", 5);
A[2] = (const char*)memcpy(new char[5], "str2", 5);
// Is this the proper way to free everything?
for (int i = 0; i < 3; ++i)
delete[] A[i];
delete[] A;
}
Run Code Online (Sandbox Code Playgroud) 将没有编码的字符串复制到C字符串中非常容易:
auto to_c_str(std::string const& str) -> char* {
auto dest = new char[str.size() + 1];
return strcpy(dest, str.c_str());
}
Run Code Online (Sandbox Code Playgroud)
但是,我该怎么做std::u8string呢?有没有STL算法可以帮助您呢?
我尝试了这个:
auto to_c_str(std::u8string const& str) -> char8_t* {
auto dest = new char8_t[str.size() + 1];
return std::strcpy(dest, str.c_str());
}
Run Code Online (Sandbox Code Playgroud)
但是,当然,std::strcpy对于utf8字符串而言不会过载。