C/C++ 字符数组的输入输出

字符数组就是char数组,当维度是一维是可以当做“字符串”,当维度是二维时可以当成是字符串数组,即若干字符串。字符数组的输入除了使用scanf外,还可以使用getchar或者gets;其输出除了使用printf外,还可以使用putchar或者puts。

(1)scanf输入,printf输出

scanf对字符串的输入有%s和%c两种格式。%c格式用来输入单个字符,它能够识别空格和换行符并将其保存到字符数组中;%s格式用来输入一个字符串,它通过空格和换行来识别一个字符串的结束。也就是说使用%s格式输入并保存到字符数组中的字符串是不含空格的。下面是一个实例:

int main(){  
    char str[10];  
    scanf("%s", str);  
    printf("%s", str);  
    return 0;  
}

输入字符串“abc def ghi”,输出的结果为“abc”。可以看到,%s识别空格作为字符串的结尾,因此第一个空格后面的字符都不会被读入。

(2)getchar输入,putchar输出

getchar和putchar分别用来输入和输出单个字符。getchar可以识别换行符和空格并将其保存。下面是一个例子:

int main(){  
    char c1, c2, c3;  
    c1 = getchar();  
    c2 = getchar();  
    c3 = getchar();           
    putchar(c1);  
    putchar(c2);  
    putchar(c3);  
    return 0;  
}

在这里我们如果输入“a“,然后敲回车,然后输入”bc“,再敲回车,输出的结果会是这样:

a

b

这是由于getchar可以识别换行符,所以c2实际上存储的是换行符,因此字符c没有被存入,字符ab之间会有一个换行出现。

(3)gets输入,puts输出

gets用来输入一行字符串并将其存放于一维数组(或二维数组的一维)中,读取字符串直到换行符结束,但换行符会被丢弃,然后再末尾添加‘\0’,它与scanf(”%s“, s)相似,但不完全相同,gets可识别空格并将其输入。puts函数会自动换行。下面是一个例子:

int main(){  
    char str1[20];  
    char str2[5][10];  
    gets(str1);  
    for(int i = 0; i < 3; i ++){  
        gets(str2[i]);  
    }  
    puts(str1);  
    for(int i = 0; i < 3; i ++){  
        puts(str2[i]);  
    }  
    return 0;  
}

输入下面几个字符串:
abc def

QAQ

T_T

WoAiNi

这几个字符串都可以原样输出,因为gets可以识别空格并将其保存到字符串中。另外需要注意的是,gets函数会无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读取操作时不会发生溢出。如果溢出,多出来的字符会被写入到堆栈中,这就覆盖了堆栈原有的内容,破坏一个或多个不相关变量的值。

你可能感兴趣的:(C++)