在没有库函数、数组或内存管理的C中,向char*添加char
在没有库函数、数组或内存管理的情况下,是否可以在C中向在没有库函数、数组或内存管理的C中,向char*添加char,c,arrays,C,Arrays,在没有库函数、数组或内存管理的情况下,是否可以在C中向char*添加char 我需要在不创建任何数组的情况下执行此操作,因此我无法在[]中使用任何内容。我不能使用malloc或任何类似的东西,也不能使用库函数 我真正的目标是旋转一根绳子 有什么方法可以像在Java中一样用C语言中的+操作符来压缩字符串吗 以下是我所拥有的: char* alphabet = "abcdefghijklmop" //I want to create a new string which is the rotated
char*
添加char
我需要在不创建任何数组的情况下执行此操作,因此我无法在[]
中使用任何内容。我不能使用malloc
或任何类似的东西,也不能使用库函数
我真正的目标是旋转一根绳子
有什么方法可以像在Java中一样用C语言中的+
操作符来压缩字符串吗
以下是我所拥有的:
char* alphabet = "abcdefghijklmop"
//I want to create a new string which is the rotated version of that string by
// n amount so if n was 3 it would be "defghijklmnopabc"
char* = string;
for(i=0; i<lengthOfString; i++){
int amountToShiftBy = (n+i);
if(amountToShiftBy>=lengthOfString)
amountToShiftBy-=lengthOfString;
string = string + *(alphabet+shift); //obviously doesn't work
}
char*alphabet=“abcdefghijklmop”
//我想创建一个新字符串,它是该字符串的旋转版本
//因此,如果n为3,则为“defghijklmnopabc”
char*=字符串;
对于(i=0;i=lengthOfString)
amountToShiftBy-=长度管柱;
字符串=字符串+*(字母+移位)//显然不行
}
总而言之,您的问题定义不清,您的意思可能很愚蠢,浪费时间,但仍有可能
有可能做标题中的事情吗
将char
添加到char*
当然,但一旦你正确地学习了C(例如,通过阅读K&R2E之类的书,并在遇到它们时做练习,而不是绕过它们),你就会发现这可能不是你想要完成的
例如,如果您有一个charc当你写&c+42
时,你在指向c的指针上加了42个字符,这使指针在c
的开头增加了42个字符;显然这是一个错误,因为c
只能容纳一个字符
。。。没有库函数、数组或内存管理器
当然可以。参见上面的例子
在现实世界中,这将是一个愚蠢的练习。我们被教导重用库函数,因为重用现有代码比重新发明轮子、测试/调试重新发明、微调发明然后再次测试/调试要快
标准库开发人员很可能比您更了解如何为每个平台编写最佳代码
…需要在不创建任何数组的情况下执行此操作,因此我无法在[]中使用任何内容
从技术上讲,[]
下标运算符不是数组运算符;它是指针运算符(就像您在代码中使用的一元*
运算符),正如C标准所解释的:
除非是sizeof运算符的操作数、_Alignof运算符或一元&运算符,或者是用于初始化数组的字符串文字,否则类型为“类型的数组”的表达式将转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,而不是左值
有没有办法在C中用+运算符连接字符串
有一些方法可以用于连接。但是,正如我在本文前面解释的,如果这更有效,那么您的标准库开发人员就会使用它。此外,它肯定不是一个简洁、惯用或优雅的解决方案;它将相当于有人在脏厕所里呕吐,并称之为营养汤.你最好想出一个更简单的方法
void append_char(char *str, char c) {
str += strlen(str);
*str++ = c; // This could be written using an add swap
*str = '\0'; // ... and so could this
}
不允许使用
中的strlen
?简单的解决方案:打开标准库的源代码,找到strlen
代码,复制并粘贴到程序中,然后……把你的计算机扔进垃圾箱!你的教授教你浪费时间
但是,如果您的教授指示您将标准库重写为spec,这将是一个有用的练习,因为它将教您如何使用标准库
…就像在java中一样
如果你想使用Java特性,那么使用Java.C不是Java,事情是不同的
整个
过程似乎有点违反直觉,但是从我自己学习的许多语言(包括Java和C)中,我可以告诉你几乎每种语言都有优点和缺点。Java有很多缺点。C也有很多缺点,不过如果你给它一个机会,你会发现C的缺点要少得多
FWIW,我不是C迷。我是Haskell迷。Haskell在语义上更接近Java,因为它有垃圾收集、静态类型和多种形式的多态性
您没有编译(它没有通过缩写词MCVE中的C)并使用数组(它没有通过标题中的测试)
尽管如此,这一目标也是可能的。创建一个与正在修改的字符串大小相同的新数组,将源的尾部复制为目标的头部,将源的头部复制为目标的尾部。例如:
void rotate_string(char *destination, char const *source, size_t n) {
if (n > strlen(n) || n > INT_MAX) { n = 0; }
sprintf(destination, "%s%.*s", source + n, (int) n, source);
}
如果不允许重用标准库中的sprintf
,请不要包含标准库;只需重新创建sprintf
。这是练习的一部分,对吗
如果你不允许使用标准库中的INT\u MAX
,请使用32767
或42
;这是一个神奇的数字,我们通常被教导不要使用神奇的数字……但你的练习正是教你这么做的。哦,好吧,教育质量很重要;如果我的教授不这么做,我会大吵大闹的他在我身上!如果没有内存,你就不能有指针指向……我有内存,我只是说我不能使用malloc、realloc、calloc、mmap、@ChrisDodd之类的函数——在C语言中,你绝对可以。你需要字符数组来生成stringsNote,这样你就无法可靠地修改字符串文字。在大多数系统中,你的代码一旦尝试编写,就会崩溃你必须有一个数组才能使用。
void rotate_string(char *destination, char const *source, size_t n) {
if (n > strlen(n) || n > INT_MAX) { n = 0; }
sprintf(destination, "%s%.*s", source + n, (int) n, source);
}