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

时间:2017-02-03 01:36:51

标签: c arrays

是否可以在没有库函数,数组或内存管理的情况下向C中的char添加char *

我需要在不创建任何数组的情况下执行此操作,因此我无法使用[]的任何内容。我无法使用malloc或其他任何类型,我无法使用库函数。

我的真正目标是旋转一个字符串。

有没有办法在C中用+运算符连接字符串,就像在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"

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
}

1 个答案:

答案 0 :(得分:1)

总而言之,你的问题是不明确的,你可能意味着什么是愚蠢的,浪费时间,但仍然可能。

  

是否可以做标题中的内容?

     

char添加到char* ...

当然,但是一旦你正确地学习了C(例如通过阅读K&amp; R2E这样的书,并且当你遇到它们而不是绕过它们的时候进行练习),你会发现这可能不是你的意思想要完成。

例如,如果你有一个char c;并且你写了&c + 42,那么你已经在指向c的指针上添加了42,这使得指针在{{{}的开头超过了42个字符。 1}};显然这是一个错误,因为c只有一个字符的空间。

  

...没有库函数,数组或内存管理[e] nt“。

不确定。请参阅上面的示例。

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

标准库开发人员很可能知道如何编写比平台更优化的代码。

  

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

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

  

除非它是sizeof运算符,_Alignof运算符或一元&amp;运算符的操作数。运算符,或者是用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素,不是左值。

  

有没有办法在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>代码,将其复制并粘贴到程序中...... 将计算机扔进垃圾箱!你的教授是教你浪费时间。

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

  

...就像你在java中一样?

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

这整个strlen事情看似违反直觉,但是我自己学习了很多语言(包括 Java和C)我可以告诉你几乎每一种语言都有利有弊。语言。 Java有许多缺点。 C也是如此,但如果你给它一个机会,你会发现C的更少。

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

<string.h>

您的MCVE无法编译(它在首字母缩略词MCVE中未通过 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"

如果您不允许从标准库中重用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_MAX32767;这是一个神奇的数字,我们通常被教导使用魔法数字......但是你的练习教会你做到这一点。那好吧。教育质量至关重要;如果我的教授试着对我这么做,我会发出声音!