使用 %s 打印时,大小为 10 的字符数组显示 11 个字符

标签 c arrays linux string

我试图解开这段代码中的谜团,但没有成功。以下程序用于打印输入的长度和行。它的最大限制为 10 个字符,对于超过 10 个字符的行,它计算所有字符但只存储 10 个。

令我困惑的是,在输出中,当输入超过 10 个字符的行时,它会打印输入的前 11 个字符,而我将该行存储在 10 个字符大小的数组中。怎么可能?

我在 Linux Mint 中使用 GCC 编译器。

#include<stdio.h>
#define MAX 10

int Getline(char arr[], int lim);

void main(){
    int len=0;
    char c=0;
    char line[MAX]={};

    len=Getline(line,MAX);
    printf("%d\n%s",len,line);
    printf("\nDo you want to continue?\t");

    while((c=getchar())=='y'){
        len=Getline(line,MAX);
        printf("\n%d\n%s",len,line);
        printf("\nDo you want to continue?\t");
    }
}

int Getline(char line[], int lim){
    int i=0;
    while((line[i]=getchar())!='\n' && i<lim){
        i++;
    }

    if(line[i]=='\n' && i<lim)   
    {
        line[i]='\0'; // This is line[lim+1]
        return i;
    }
    else if(i==lim){
    while(getchar()!='\n')
    i++;
    return i+1;
    }
}

输入输出如下图,我用的是linux mint中的gcc编译器。

输出:

Queen
5
Queen
Do you want to continue?        yQueenOfDragons

14
QueenOfDrag
Do you want to continue?        y123456789012345

15
12345678901
Do you want to continue?        yYouKnowNothingJonSnow

21
YouKnowNoth
Do you want to continue?        n

另外,当我按如下方式在 while 循环中交换测试条件时

while(i<lim && (line[i]=getchar())!='\n')

当行长超过限制时,它会在打印前 10 个字符后打印一个奇怪的“@”字符。输出如下所示

输出 2:

Queen
5
Queen
Do you want to continue?        yQueenOfDragons

13
QueenOfDra@
Do you want to continue?        y12345678901

10
1234567890@
Do you want to continue?        yYouKnowNothingJonSnow

20
YouKnowNot@
Do you want to continue?        n

请解释奇怪的行为。提前致谢!

PS:这是 Dennis M Ritchie 和 Brian Kernighan 的“The C Programming Language”中的练习 1-16。

最佳答案

我怀疑它正在打印第 11 个字符,因为这个 while 表达式:

while((line[i]=getchar())!='\n' && i<lim){
  i++;
}

i < lim返回false,你已经放了getchar()的结果在line[i] .

此外,请记住始终为空终止符留出空间并完成字符串。 Getline(line, lim)并不总是在 line 处放置一个以 null 结尾的字符串.

关于使用 %s 打印时,大小为 10 的字符数组显示 11 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50090720/

相关文章:

java - 如何比较数组元素并将相应元素添加到第三个数组?

javascript - 如何以 Angular 查找给定数组列表的所有行中是否存在相同的值

linux - 将字符串写入大量文件

linux - 当前最新 Firefox 手动安装程序的脚本

c - fgets 在 C 中不起作用(标准输入看起来已满)

c - 在位数组中有效地查找 '1' 的位置

c - 在C中以十六进制读取文件内容

python - AttributeError :'list' 对象没有属性 'size'

linux - 为什么在将原始字节数据发送到 TAP 设备时前导 4 字节数据丢失?

c - 尝试使用用户名运行 MPI 程序时出错