2

我对 C 很陌生,所以为了学习它,我试图创建一个输出龙曲线的程序。这是我到目前为止得到的:

#include <stdio.h>
#include <string.h>
#define ebene 5

char str_n[ebene-1];
char tmp[256]; // ="1"; // 1=R, 0=L
char text[256];

int a_index=0;


char switch_middle(char iarray[256]) {
    int num=((2^a_index-1)-1)/2+1; // Nummer der Zahlen pro ebene |-1|/2|+1 -> Index des mittleren Buchstaben
    if(num>=0) {
        iarray[num]='0';
    } else {
        iarray[0]='\0';
    }
}

int main() {
    printf("Hauptschleife erreicht");

    while(a_index<ebene) {
        //snprintf(text, sizeof text, "%s1%s", tmp, switch_middle(tmp));
        strcpy(text, tmp);
        strcpy(text, "1");
        strcpy(text, switch_middle(tmp));   // Error occures here!

        //str_n[a_index]=text;
        for(long i=sizeof(tmp)/sizeof(tmp[0]); i--; ) {
                tmp[i]=text[i];
            }
        printf("Ebene: %d\n", a_index);
        //printf("  Wert: %s", str_n[a_index]);
        printf("    Wert: %d\n", text);

        a_index++; // für Mathefunktionen
    }
}

尝试编译它会给我一堆警告和一个错误;我在这个问题的标题中提到的那个(从类型'char *'分配给类型'char [256]'时不兼容的类型)。是的。任何帮助,将不胜感激 (:

*编辑:好的,下面的评论解决了大部分问题;现在只剩下一个警告,那就是“传递 'strcopy' 的参数 2 使指针从没有强制转换的整数”和“预期的 'const cgar * restrict' 但参数的类型为 'char'”作为包含的注释string.h。当我尝试运行该程序时,它给了我一个内存访问错误。我在上面的代码中标记了这些行。

*编辑²:已修复。感谢以下所有人(:

4

3 回答 3

5

您不能在 C 中分配数组。您有两种选择来实现您想要的效果:要么使用memcpy()函数(它在标准库中,只是#include <string.h>),要么自己编写副本:

for(long i = sizeof(tmp)/sizeof(tmp[0]); i--; ) tmp[i] = text[i];

请注意,我计算了要复制的数据量,而不仅仅是硬编码 256,以防止将来在您想要更改所涉及数组的大小时出现错误。一般来说,应该不惜一切代价避免固定限制。

编辑:有关复制数组的第三种方法,请参阅 Aarons 评论。


背景资料:

您可能想知道错误消息的文本,它报告了类型不匹配,您尝试分配相同类型的两个变量。原因是数组标识符在几乎所有上下文中都衰减为指向数组第一个元素的指针。这就是为什么,您的作业右侧会衰减到char*左侧仍然是 type 的原因char[256]

于 2013-10-06T10:12:23.533 回答
1

这条线

 tmp=text; is wrong.   

您正在尝试更改作为常量指针的数组(tmp)的基地址。这意味着无法更改数组的基地址。这就是它抛出此错误的原因。并且警告在那里是因为您试图在字符位置分配一个字符串。这条线

   iarray[num] = "0"; 

“0”是一个字符串。试着把它变成'0'。现在它是一个字符。因此不会有警告。

    iarray[0] = ""; //Same reason
于 2013-10-06T10:08:12.300 回答
1

char switch_middle(char iarray[256]) {

应该

char * switch_middle(char iarray[256]) {

你应该在最后返回数组:

char * switch_middle(char iarray[256]) {
    int num=((2^a_index-1)-1)/2+1; // Nummer der Zahlen pro ebene |-1|/2|+1 -> Index des mittleren Buchstaben
    if(num>=0) {
        iarray[num]='0';
    } else {
        iarray[0]='\0';
    }
    return iarray;
}

=====

附带说明一下,C 数组有一些奇怪的特性。例如,它们在函数的参数列表中被忽略。 char * switch_middle(char iarray[256]) {完全等价于char * switch_middle(char * iarray) {,后者更具可读性。

这很奇怪,请参见ideone 上的示例

事实上,括号内的数字完全被忽略了——您可以将它从 256 更改为任何其他数字,程序不会改变行为!此规则仅适用于函数的参数。在局部变量中,数字确实意味着什么。

这意味着您不能真正将数组直接传递给函数。是的,外部函数可以发送一个数组,但接收函数不会将其视为一个数组。[]坦率地说,我认为这是 C 语言中的一个糟糕设计。我认为如果出现在这样的参数列表中,编译器应该发出警告。

于 2013-10-06T10:49:21.550 回答