这个好像用数组写吧?

img

刚学数组不就还不熟练,有没有会的,用的codeblocks,为啥我二维数组不能把一串英文空格后又一串英文搞成一个数组里面?

要看你的代码是怎么处理的,具体可以使用fgets()函数读取一行输入读入存储书名的二维字符数组,下面是一个实现,供参考:

1、首先功用scanf()函数获取n

2、使用fgets()函数循环获取n行书名到存储书名二维字符数组,并剔除书名字符串中的换行符

3、遍历书名二维字符数组,统计相同书籍的册数

4、打印结果。

代码如下:

参考链接:
C语言读取一行输入_iownE9的博客-CSDN博客_c读取一行


#include <stdio.h>
#include <string.h>

int main(void){
    
    int n;
    char books[30][50];
    
    scanf("%d",&n); //获取n 
    getchar();  //读走scanf()丢弃的换行符,防止下面的fgets()函数读到这个换行符 
    for(int i=0;i<n;i++){
        //https://blog.csdn.net/m0_71159754/article/details/125402071
        fgets(books[i],50,stdin);  //读取一行输入作为书名,依次存入二维数组 
        
        // strlen(books[i])-1 是当前输入的书名字符串最后一个字符
        //如果他是换行符,则将它替换为字符串的结束字符'\0',以便下面进行正确的打印和计算册数 
        if(books[i][strlen(books[i])-1]=='\n'){  //剔除书名中的换行符 
            books[i][strlen(books[i])-1]='\0';
        }
    //    printf("books[%d]=%s\n",i,books[i]);
    }
    
    int num[30]={0}; //存储相同书籍的册数 
    for(int i=0;i<n;i++){
        num[i]++;  //默认把当前书籍的册数设置为1 
    
        for(int j=i+1;j<n;j++){  //遍历后面的书籍中是否有和当前书籍同名的书籍 
            
            //如果当前书籍和后面的书籍同名,并且不是空名字的书籍,则把书籍的册数+1, 
            if(books[j][0]!='\0'&&strcmp(books[i],books[j])==0){
                num[i]++;
                strcpy(books[j],"");  //当计数完成后,把后面的书籍的名字置为空字符串 
            }
            
            
        }
    }
    
    //打印结果 
    for(int i=0,j=0;i<n;i++){
        
        if(books[i][0]!='\0'){ //如果当前书籍的名字不为空,则打印对应的册数 
            printf("%d %s\n",num[i],books[i]);
        }
        
    }
    
} 

img