C 为什么不相关/未声明的变量会影响另一个变量的输出?

标签 c substring strncpy

当字符数组substring[#]设置为[64]时,文件输出一个额外的字符。附加字符因每次编译而异。有时 es?,有时 esx 等等。

如果我将 [64] 更改为任何其他数字(至少我尝试过的数字:65、256,1..),它会正确输出为 es.

更奇怪的是,如果我在这个文件中保留未使用/未声明的字符数组 char newString[64],即使是 64,它也会输出正确的子字符串 es

  1. 看似任意大小的 64 对输出有何影响?
  2. 完全不相关的字符数组 (newString) 如何影响另一个字符数组的输出方式?

.

int main () {
    char string[64];    
    char newString[64];
    char substring[64];

    fgets(string,64,stdin); 
    strncpy(substring, string+1, 1);
    printf("%s\n", substring);

    return 0;
}

最佳答案

问题是,strncpy()不会复制 null 终止符,因为您已要求它不要这样做。

使用 strncpy() 既安全又危险,因为它不会总是复制 null 终止符,而且对单个字节使用它是没有意义的,而是这样做

substring[0] = string[1];
substring[1] = '\0';

它会起作用。

您应该阅读手册页 strncpy(3)正确理解我的意思,如果你每次都仔细阅读手册,你会在更短的时间内成为更好的程序员。

关于C 为什么不相关/未声明的变量会影响另一个变量的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41132251/

相关文章:

c - 我需要帮助理解下面代码中两个的替换

c - lint 中强类型检查的问题(警告 632)

c - 使用/clr 支持编译的 C++-CLI 库调试 C 程序

java - 如何在Java中提取多个引用的子字符串

c - 在我的例子中是 strncpy 或 strlcpy

c - strcpy()/uninitialized char pointer 这段代码背后的技巧是什么?

c - 在 C 中使用 boolean 值

c# - kentico 无法修剪字符串,错误 outOfBoundException

c - 未初始化的值是由堆分配创建的

c# - 如何使用 Regex 将十进制值中的句点转换为对 URL 更友好的新闻报道