在没有库函数、数组或内存管理的C中,向char*添加char

在没有库函数、数组或内存管理的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

在没有库函数、数组或内存管理的情况下,是否可以在C中向
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);
}