《C prime plus (第五版)》 ---第11章 字符串和字符串函数---2

11-3:字符串 输出

  三个标准的函数:puts() fputs() printf()

  1.puts()函数:

  

#include<stdio.h>
#define DEF "I an a #define string ."
int main(){
    char str1[80] = "An array was initialized to me .";
    const char *str2 = "A pointer was initialized to me.";
    
    puts("I'm an argument to puts().");
    puts(DEF);
    puts(str1);
    puts(str2);
    puts(&str1[5]);
    puts(str2+4);
    
    return 0;
} 

  在这个程序中,&str1[5]是数组str1的第6个元素。str2+4是i的那个内存单元,puts函数遇到空字符就会停下来。

  2.fputs()函数,这个函数是面向文件的,与puts()函数的区别是:第二个参数说明要写的文件。同时,在输出的时候不会自动添加换行符。

  3.printf()函数:不讲解。

  4.自定义输入/输出函数:

void put1(const char *string){
    while(*string)
        putchar(*string++)
}

  5.字符串函数:

    1)strlen()函数:我们来看一个试图缩短字符串的函数。

    

#include<stdio.h>
#include<string.h>
void fit(char *,unsigned int);
int main(){
    char mesg[] = "Hold on to your hats,hackers. ";
    puts(mesg);
    fit(mesg,7);
    puts(mesg);
    puts("Let's look at some more of the string. ");
    puts(mesg + 8);
    return 0;
} 
void fit(char *string,unsigned int size){
    if(strlen(string) > size){
        *(string + size) = '\0';
    }
}

    2)strcat()函数:接受两个字符串参数。第二个字符串会添加到第一个字符串后边,然后返回第一个字符串。同时第一个字符串改变,第二个字符串不变。

    3)strncat()函数:接受三个参数,第三个参数是数字,是函数最多接受的字符数或者遇到空字符为止。

    

#include<stdio.h>
#include<string.h>
#define SIZE 30
#define BUGSIZE 13
int main(){
    char flower[SIZE];
    char addon[] = "s smell like old shoes.";
    char bug[BUGSIZE];
    int available;
    
    puts("What is yout favorite flowers?");
    gets(flower);
    if((strlen(addon) + strlen(flower) +1 )<= SIZE)
        strcat(flower,addon);
    puts(flower);
    puts("What is your favorite bug?");
    gets(bug);
    available = BUGSIZE - strlen(bug) - 1 ;
    strncat(bug,addon,available);
    puts(bug);
    
    return 0 ;
} 

 

    4)strcmp()函数:这个函数用来比较两个数组中的字符串的内容。

    这个程序来判断程序是否应该停止读取输入:

  

#include<stdio.h>
#include<string.h>
#define SIZE 81
#define LIM 100
#define STOP "quit"
int main(){
    char input[LIM][SIZE];
    int ct = 0 ;
    
    printf("Enter up to %d lines(type quit to quit):\n",LIM);
    while(ct < LIM && gets(input[ct]) != NULL && strcmp(input[ct],STOP) != 0){
        ct++;
    }
    printf("%d strings entered\n",ct);
    
    return 0;
} 

 

    5)strncmp()函数:这个函数有第三个参数,用来限定比较字符串的个数。

  

#include<stdio.h>
#include<string.h>
#define LISTSIZE 5 
int main(){
    char *list[LISTSIZE] = {
        "astronomy",
        "astounding",
        "astronphysics",
        "ostracize",
        "asterusm"
    };
    int count = 0 ;
    int i ;
    for(i = 0 ; i < LISTSIZE; i++){
        if(strncmp(list[i],"astro",5) ==0 ){
            printf("Found:%s\n",list[i]);
            count++;
        }
    }
    printf("The list contained %d words beginning""with astro.\n",count);
    
    return 0;
} 

    6)strcpy()函数和strncpy()函数:

  

#include<stdio.h>
#include<string.h>
#define SIZE 40
#define LIM 5
int main(){
    char qwords[LIM][SIZE];
    char temp[SIZE];
    int i = 0 ;
    
    printf("Enter %d words beginning with q\n",LIM);
    while(i < LIM && gets(temp)){
        if(temp[0] != 'q'){
            printf("%s doesn't begin with q!\n",temp);
        }
        else{
            strcpy(qwords[i],temp);
            i++;
        }
    }
    puts("Here are the words accepted:");
    for(i = 0 ; i < LIM ; i++){
        puts(qwords[i]);
    }    
    
    return 0 ;
} 

    strcpy()函数接受两个字符串指针参数,指向最初字符串的第二个指针可以是已声明的指针,数组名或字符串常量。声明一个数组将为数据分配存储空间,而声明一个指针只为一个地址分配存储空间。

    strcpy()函数的高级属性:该函数返回第一个参数的值,一个字符的地址,所以这样可以复制数组的一部分。

  

#include<stdio.h>
#include<string.h>
#define WORDS "beast"
#define SIZE 40

int main(){
    char *orig = WORDS ;
    char copy[SIZE] = "Be the best that you can be.";
    char *ps ;
    
    puts(orig);
    puts(copy);
    ps = strcpy(copy+7,orig);
    puts(copy);
    puts(ps);
} 

    strncpy()函数:这个函数接受第三个参数指明复制的大小。

#include<stdio.h>
#include<string.h>
#define SIZE 40
#define TARGSIZE 7
#define LIM 5 
int main(){
    char qwords[LIM][TARGSIZE];
    char temp[SIZE];
    int i = 0 ;
    
    printf("Enter %d words beginning with q :\n",LIM);
    while( i < LIM && gets(temp)){
        if(temp[0] != 'q'){
            printf("%s doesn't begin with q!\n",temp);
        }
        else{
            strncpy(qwords[i],temp,TARGSIZE - 1);
            qwords[i][TARGSIZE - 1] ='\0';
            i++; 
        }
    }
    puts("Here are the words accepted: ");
    for(i = 0 ; i < LIM ; i ++){
        puts(qwords[i]);
    }
    
    return 0;
} 

  7)sprintf()函数:提供了把几个元素合成一个字符串。第一个参数是目标字符串的地址,其余参数和printf()函数一样。

  

#include<stdio.h>
#define MAX 20 

int main(){
    char first[MAX];
    char last[MAX];
    char formal[2*MAX + 10];
    double prize ;
    
    puts("Enter your first name:");
    gets(first);
    puts("Enter your last name");
    gets(last);
    puts("Enter your prize money");
    scanf("%lf",&prize);
    sprintf(formal,"%s,%-19s:RMB%6.2f\n",last,first,prize);
    puts(formal);
    
    return 0; 
} 

 

  

posted @ 2015-12-16 11:35  易天曦小盆友  阅读(409)  评论(0编辑  收藏  举报