c - 没有赋值就将字符串连接到另一个字符串中,这是为什么?

标签 c string variable-assignment strcat

下面是程序中的函数:

//read the specified file and check for the input ssn
int readfile(FILE *fptr, PERSON **rptr){
    int v=0, i, j;
    char n2[MAXS+1], b[1]=" ";

    for(i=0; i<MAXR; i++){
        j=i;
        if(fscanf(fptr, "%c\n%d\n%19s %19s\n%d\n%19s\n%d\n%19s\n%19s\n%d\n%d\n%19s\n\n",
                    &rptr[j]->gender, &rptr[j]->ssn, rptr[j]->name, n2, &rptr[j]->age, 
                    rptr[j]->job, &rptr[j]->income, rptr[j]->major, rptr[j]->minor,
                    &rptr[j]->height, &rptr[j]->weight, rptr[j]->religion)==EOF) {
            i=MAXR;
        }
        strcat(rptr[j]->name, b);
        //strcat(rptr[j]->name, n2);
        if(&rptr[MAXR]->ssn==&rptr[j]->ssn)
            v=j;
    }
    return v;
}

注释行是这样的,因为由于某种原因,数组“b”包含字符串“n2”,尽管明显缺少赋值。这发生在第一个 strcat 调用之前,但在 fscanf 调用之后/期间。

它确实实现了预期的目标,但为什么 n2 连接到 b 的末尾,特别是当 b 只为 1 个数组元素保留空间时?

以下是 fscanf 调用后的变量定义片段:

*rptr[j]->name = "Rob"

b = " Low"

n2= "Low"

最佳答案

它有效,因为你很幸运。 bn2 在内存中恰好以正确的顺序相邻。 C 不对数组进行边界检查,并且很乐意让您溢出它们。所以你可以像这样声明一个数组:

char someArray[1] = "lots and lots of characters";

C 编译器(当然是旧的编译器)会认为这没问题,即使 someArray 中显然没有足够的空间来存储那么多字符。我不确定它是否定义了在这种情况下会做什么(我怀疑没有),但在我的编译器上,它将人口限制为数组的大小,因此它不会溢出边界(someArray =={'l'})。

您的情况是相同的(尽管不那么极端)。 char b[1] 正在创建一个有足够空间存储 1 个字节的数组。您在该字节中放置了一个空格,因此没有空间容纳空终止符。 strcat,不断复制内存,直到到达空终止符,因此它将继续下去,直到找到一个终止符,即使直到下一个字符串的末尾(这就是您的情况发生的情况) )。

如果您使用的是 C++ 编译器,它至少会抛出一个警告(或更可能是一个错误),告诉您您试图将太多项放入数组中。

关于c - 没有赋值就将字符串连接到另一个字符串中,这是为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6098294/

相关文章:

c - 检测在 C 中按下了哪个键

c - Windows 问题中的 Openssl

c - 从文件读取数据后动态存储数据

python - 变量中有原始输入?

java - 两个日期之间的差异和当前时间的百分比java

c - 为什么 fflush(stdin) 函数不起作用?

java - 正则表达式 String.split( )

在 C 中动态创建文件名

javascript - JS变量声明的类型

javascript - 左侧赋值无效