【问题标题】:Why is the value of variable changing without changing it in the program?为什么变量的值在程序中改变而不改变?
【发布时间】:2020-11-24 14:15:54
【问题描述】:

变量的值在输入“abcdefghijklmnop”后自动变化,按要求为16个字符。我不明白为什么它会自动改变。如果能为此提供任何帮助,我将不胜感激。

代码如下:

void test(void){
    char    arr[16];
    int     magic = 42;

    printf("magic = %d\n", magic);
    
    printf("Enter a character string: ");
    
    getString(arr, 16 + 1);
    printf("The length of string [%s] is %d\n", arr, stringLength(arr));
    
    printf("magic = %d\n", magic);

}
int main(int argc, char * argv[])
{
    test();
    printf("\n");
    return 0;
}

谢谢

【问题讨论】:

  • 你告诉函数有16+1元素,但只有16。不要忘记字符串终止符。数组char arr[16]只能存储长度为15的字符串。
  • 什么变量改变了? getString() 是什么?
  • 您需要更改数组的大小,不要忘记\0
  • 您通过访问数组arr 越界观察到未定义行为。要存储 16 个字符的 C 字符串,您至少需要数组大小 17
  • 当您在数组边界之外写入时,可能发生的许多坏事之一是您覆盖了恰好位于内存中该地址的其他变量。专注于如何让你的代码一开始就不会那样做。

标签: arrays c string char


【解决方案1】:

您告诉getString 读取的字符数超过了arr 所能容纳的字符数,这些多余的字符被存储到arr 之外的内存中,从而覆盖了magic

要存储 N 个字符长的字符串,您需要一个 至少 N+1 个元素宽的数组。一个 16 元素的 char 数组可以存储 最多 15 个字符长的字符串,外加字符串终止符。与其告诉getString 读取 16+1 个字符,不如告诉它读取 16-1。

其实你应该告诉的

getString(arr, sizeof arr - 1 );

【讨论】:

    【解决方案2】:

    也许这可以解决你的问题:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <ctype.h>
    #include <string.h>
    
    #define MAX 20
    
    void test(void){
        char    arr[MAX];
        int     magic = 42, stringLen = 0;
    
        printf("magic = %d\n", magic);
        
        printf("Enter a character string: ");
        
        fgets(arr, MAX, stdin);
        stringLen = strlen(arr);
    
        if(arr[stringLen -1] == '\n'){
            arr[stringLen -1] = '\0';
            stringLen = strlen(arr);
    
        }
        printf("The length of string [%s] is %d ", arr, stringLen);
        
        printf("magic = %d\n", magic);
    
    }
    int main()
    {
        test();
        printf("\n");
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-04
      • 2015-01-07
      相关资源
      最近更新 更多