【问题标题】:What is the difference between char array[100]; and char array[100] = "";?char array[100]; 有什么区别?和 char 数组 [100] = "";?
【发布时间】:2020-01-04 21:32:07
【问题描述】:

我正在尝试编写一个 C 程序来加载文件、读取文件并输出文件中最长的行以及符号数。结果写入另一个文件。代码似乎可以正常工作,但是我想了解为什么在稍微更改数组的定义以从maxLine 定义中删除等于空引号(= "")时会得到错误的结果。例如,如果我写以下内容:

char currentLine[100]; 
char maxLine[100]; 

然后我得到不想要的结果。

这是整个函数:

#define MAX_FILE_NAME 50

void maxCharRow()
{
    FILE *fptr;
    errno_t err;

    char fileNameRead[MAX_FILE_NAME] = "test.txt";
    char fileNameWrite[MAX_FILE_NAME] = "results.txt";
    char currentLine[100]; 
    char maxLine[100] = "";  

    if ((err = fopen_s(&fptr, fileNameRead, "r")) != NULL) {
        printf("Could not open the file: %s\n", fileNameRead);
        exit(1);
    }

    while (fgets(currentLine, sizeof(currentLine), fptr) != NULL)
    {
        if (strlen(maxLine) < strlen(currentLine))
        {
            strcpy_s(maxLine, currentLine);
        }
    }
    printf("\nLongest line in file has %i symbols\nand its content is:%s", strlen(maxLine), maxLine);

    ((err = fopen_s(&fptr, fileNameWrite, "w")) != NULL); {
        fprintf(fptr, "%s", maxLine);
        exit(1);
    }
    fclose(fptr);
}

【问题讨论】:

  • if (strlen(maxLine)... 需要 maxLine 被初始化,如果你只是这样做 char maxLine[100]; 则不是
  • with char maxLine[100] = ""; 最终得到一个数组,其中所有 100 个元素都是 '\0';使用char maxLine[100];,你最终会得到一个数组,其中元素的内容可以是任何东西(甚至,在奇怪的架构中,可能是非法的)。
  • 这个strcpy_s(maxLine, currentLine); 看起来不对。这个函数应该用三个参数调用:port70.net/~nsz/c/c11/n1570.html#K.3.7.1.3
  • 它可能看起来有问题,但是当您不指定大小时,它就像 strcpy 一样正常工作。我使用它只是因为 Visual Studio 不喜欢 strcpy。

标签: c arrays char


【解决方案1】:

在c中""是一个以空字符0结尾的空字符串。

由于 char currentLine[100] 是一个局部变量,默认情况下它不初始化为零,并且填充了不确定的值。

但是,如果您将第零个元素初始化为 0"",那么 c 将用零初始化整个数组。

示例:

#include <stdio.h>

int main()
{
    char arr0[100];
    char arr1[100] = "";
    char arr2[100] = {0};

    for(int i=0; i<100; ++i){
        printf("%d ", arr0[i]);
    }
    printf("\n");
    for(int i=0; i<100; ++i){
        printf("%d ", arr1[i]);
    }
    printf("\n");
    for(int i=0; i<100; ++i){
        printf("%d ", arr2[i]);
    }
    printf("\n");
}

输出:

0 0 0 0 0 0 0 0 -1 -75 -16 0 0 0 0 0 -62 0 0 0 0 0 0 0 -89 -82 55 -96 -4 127 0 0 -90 -82 55 -96 -4 127 0 0 85 -105 -84 -34 -92 127 0 0 1 0 0 0 0 0 0 0 101 88 74 28 -111 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 88 74 28 -111 85 0 0 -48 85 74 28 -111 85 0 0 -80 -81 55 -96 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

编辑:

还要注意,即使您先设置例如。 3 个元素到非零值char arr0[100] = {1,2,3} 其余元素仍将初始化为零。

【讨论】:

  • 这里“垃圾值”的更准确术语是“不确定值”,因为它们实际上会随着时间而改变。
  • 这个for(int i=0; i&lt;100; ++i){ printf("%d ", arr0[i]); } 读取“不确定值”,这反过来可能引发臭名昭著的未定义行为。根据经验:永远不要读出未初始化的变量,因为这很危险,绝对没有理由这样做,永远不要。
  • 为了完全准确,将“set”替换为“initialise”。因为这个arr0[0] = 0 也将arr0 的第一个元素设置0,但接触任何其他元素。
【解决方案2】:

"" 分配给数组会以空值结尾,因此它会变成一个字符串。

就像这样做:

char array[100] = { '\0' };

请注意,在全局范围内不需要这样做,因为全局范围内的变量已经初始化为零。

【讨论】:

  • 你是对的,请注意:char array[100] = { '\0' }; 将所有元素设置为 '\0' (array[0] = '\0'; /* explicitly */ array[1] = array[2] = ... array[99] = 0;)。
猜你喜欢
  • 2020-06-26
  • 2017-12-23
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2021-08-24
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多