是否可以在没有库函数,数组或内存管理的情况下将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添加到char* ...


当然可以,但是一旦您正确地学习了C语言(例如,通过阅读诸如K&R2E之类的书并在遇到它们而不是绕过它们的同时进行这些练习)之后,您就会知道这可能不是您想要完成的。

例如,如果您有一个char c;并编写了&c + 42,则在指向c的指针上添加了42,这使该指针比c的开头增加了42个字符。显然这是一个错误,因为c仅可容纳一个字符。


  ...没有库函数,数组或内存管理”。


当然。请参阅上面的示例。

在现实世界中,这将是一个愚蠢的练习。我们被教导重用库函数,因为重用现有代码比重新发明轮子,测试/调试重新发明,微调发明然后再次测试/调试更快。

标准库开发人员很可能比您知道如何为每个平台编写更多的最佳代码。


  ...需要在不创建任何数组的情况下进行操作,因此我无法在[]中使用任何内容...


从技术上讲,[]下标运算符不是数组运算符;它是数组运算符。正如C标准的6.3.2.1p3所说,它是一个指针运算符(就像您在代码中使用的一元*运算符一样):


  除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为“ array of type”的表达式转换为带有键入“指向类型的指针”,它指向数组对象的初始元素,而不是左值。





  有什么办法用C中的+运算符连接字符串吗?


a variation of the xor swap, known as the add swap可用于串联。但是,正如我在本文前面所解释的那样,如果这样效率更高,那么您的标准库开发人员就会使用它。另外,这肯定不是一个简洁,惯用或优雅的解决方案。这相当于有人扔在肮脏的厕所里称其为营养汤。您最好提出一个更简单的方法。

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中的<string.h>吗?简单的解决方案:打开标准库的源代码,找到strlen代码,将其复制并粘贴到您的程序中,然后将计算机扔进垃圾箱!您的教授正在教您浪费时间。

但是,如果您的教授指示您将标准库重写为spec,这将是一个有用的练习,因为它会教您如何使用标准库。


  ...就像您可以在Java中一样?


如果要使用Java功能,请使用Java。 C不是Java。事情做得不同。

整个<string.h>事情似乎是违反直觉的,但是通过自己学习多种语言(包括Java和C),我可以告诉您几乎每种语言都有优点和缺点。 Java有很多缺点。 C也是如此,但是如果您给它机会,您会发现C的数量要少得多。

FWIW,我不是C迷。我是Haskell迷。 Haskell在语义上更接近Java,因为它具有垃圾回收,静态类型和多种形式的多态性。


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"



您的MCVE不会编译(它在首字母缩写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_MAX,请在其位置使用3276742;否则,请使用。这是一个魔术数字,我们通常被教导不要使用魔术数字...但是您的锻炼却在教您如何做到这一点。那好吧。教育质量至关重要;如果我的教授对我这样尝试,我会大吵大闹!

关于c - 在没有库函数,数组或内存管理的情况下,将C中的char添加到char *中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42015376/

10-11 23:09
查看更多