| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 904 人关注过本帖
标题:一个二维字符组转一维字符组问题
只看楼主 加入收藏
可怜的C人
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2013-11-18
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:13 
一个二维字符组转一维字符组问题
请编写函数fun,函数的功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。
例如,二维数组中的数据为:
W  W   W   W
S   S    S    S
H   H   H    H
则字符串中的内容应是:WSHWSHWSH。(要求字符从键盘输入,且每个字符间有空格
我的算法是
#include<stdio.h>
#include<string.h>
void fun(char a[100][100],int M,int N)
{int i,j,n=0;
char c[100];
for(j=0;j<=N-1;j++)
 { for(i=0;i<=M-1;i++)
  c[n]=a[i][j];n++;
  }
  puts(c);
}
void main()
{int M,N,i,j;
char a[100][100];
printf("请输入行数M:");
scanf("%d",&M);
printf("请输入行数N:");
scanf("%d",&N);
printf("请输入%d个字符:",M*N);
for(i=0;i<=M-1;i++)
  for(j=0;j<=N-1;j++)
      scanf("%c",&a[i][j]);
 for(i=0;i<=M-1;i++)
  for(j=0;j<=N-1;j++)
  printf("%c ",a[i][j]);
  printf("\n");
  fun(a,M,N);

}
问题是运行不了  还有字符串的空格处理  求大神解答 拜托了!!新手痛苦中
搜索更多相关主题的帖子: include 字符串 键盘 
2013-11-18 23:21
蔡梓锋
Rank: 4
等 级:业余侠客
帖 子:106
专家分:202
注 册:2013-4-20
收藏
得分:0 
#include<stdio.h>
#include<string.h>
void fun(char a[100][100],int M,int N)
{
    int i,j,n=0;
    char c[100];
    for(j=0;j<=N-1;j++)
    for(i=0;i<=M-1;i++)
    c[n++]=a[i][j];  
    puts(c);
}
int main()
{
    int M,N,i,j;
    char a[100][100];
    printf("请输入行数M:");
    scanf("%d",&M);
    printf("请输入列数N:");
    scanf("%d",&N);
    printf("请输入%d个字符:",M*N);
    for(i=0;i<=M-1;i++)
    for(j=0;j<=N-1;j++)
    scanf(" %c",&a[i][j]);      
    for(i=0;i<=M-1;i++)
    for(j=0;j<=N-1;j++)
    printf("%c",a[i][j]);
    printf("\n");
    fun(a,M,N);
    return 0;
}

[ 本帖最后由 蔡梓锋 于 2013-11-19 00:31 编辑 ]

加油加油!
2013-11-19 08:28
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:8 
#include<stdio.h>
#include<string.h>
void fun(char a[100][100],int M,int N)
{
    int i,j,n=0;
    char c[100];
    for(j=0;j<=N-1;j++)
    {
        for(i=0;i<=M-1;i++)
            c[n++]=a[i][j];    //直接一条语句就OK,不然你两条语句然而内循环却没有加花括号,肯定得不到想要的结果
    }
    c[n]='\0';          //加上字符串结束标志,不然会有 “烫烫烫烫烫烫。。。”
    puts(c);
}

void main()
{
    int M,N,i,j;
    char a[100][100];
    printf("请输入行数M:");
    scanf("%d",&M);
    printf("请输入行数N:");
    scanf("%d",&N);
   
    printf("请输入%d个字符:\n",M*N);
    for(i=0;i<=M-1;i++)
        for(j=0;j<=N-1;j++){
            fflush(stdin);            //清空一下缓冲区,不然输入会有问题,因为这是字符输入
            scanf("%c",&a[i][j]);
        }
    for(i=0;i<=M-1;i++){
        for(j=0;j<=N-1;j++)
            printf("%c ",a[i][j]);
        printf("\n");
    }
    fun(a,M,N);
}

你的程序只能这样一个一个输入了...
图片附件: 游客没有浏览图片的权限,请 登录注册
收到的鲜花
  • 可怜的C人2013-11-19 12:26 送鲜花  2朵   附言:我很赞同

三十年河东,三十年河西,莫欺少年穷!
2013-11-19 08:50
heroinearth
Rank: 10Rank: 10Rank: 10
来 自:云南曲靖
等 级:青峰侠
帖 子:430
专家分:1506
注 册:2011-10-24
收藏
得分:1 
程序代码:
#include<stdio.h>
#include<string.h>

void fun(char a[][100],int M,int N)
{int i,j,n=0;
char c[100];
for(i=0;i<N;i++)
{ for(j=0;j<M;j++)
  c[n++]=a[j][i];
}
  c[n]='\0';
  puts(c);
}

void main()
{int M,N,i=0,j=0;
char ch;
char a[100][100];
printf("请输入行数M:");
scanf("%d",&M);
printf("请输入列数N:");
scanf("%d",&N);
printf("请输入%d个字符:",M*N);

while(i<M)
{
    ch=getchar();
    if(ch!=' ' && ch!='\n')
    {
        a[i][j]=ch;
        ++j;
        if(j==N)
        {
            j=0;
            ++i;
        }
    }
}

for(i=0;i<=M-1;i++)
  for(j=0;j<=N-1;j++)
  printf("%c",a[i][j]);
  printf("\n");
  fun(a,M,N);

}
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-11-19 09:12
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:1 
回复 楼主 可怜的C人
楼主, 你的代码有几个问题,
第一, 你的二维数组有100*100=10000个数据, 而你定义的一维数组b只有100个.保存不下这么多吧,
第二, 就是你输入, 包括了空字符在内的所有字符(你自己也说了),
第三, 输出一维数组用puts()函数, 是不合适的, 你的数组里面没有'\0'字符结束.
我大概按你的格式修改了一下,
程序代码:
#include <stdio.h>
#include <ctype.h>

#define M 100
#define N 100

void fun(char *b, char a[][N], int m, int n)
{
    int i, j;

    for (j = 0; j < n; ++j)
        for (i = 0; i < m; ++i)       
            *b++ = a[i][j];
}

int main()
{
    char a[M][N];           // 二维数组
    char b[M*N];            // 一维数组
    int c;
    int i, j;
    int m, n;

    printf("请输入数组的行数: ");
    scanf("%d", &m);
    printf("请输入数组的列数: ");
    scanf("%d", &n);
   
    // 输入字符
    printf("请输入 %d个字符:\n", m * n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; ) {
            c = getchar();
            if (isalpha(c)){          // 如果读取的是字母才保存到数组, 其它字符都不操作.
                a[i][j] = c;
                j++;
            }
        }

    printf("输入的二维数组为:\n");       // 打印二维数组
    for (i = 0; i < m; i++) {
        for (j = 0; j < m; j++)
            putchar(a[i][j]);
        putchar('\n');
    }

    fun(b, a, m, n);                   // 数组转换

    printf("转换为一维数组为:\n");     // 打印一维数组
    for (i = 0; i < m*n; i++)
        putchar(b[i]);
    putchar('\n');
    return 0;
}


 
2013-11-19 09:50
可怜的C人
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2013-11-18
收藏
得分:0 
回复 3楼 韶志
哇!!!大神啊 !!!能帮我分析下我的问题么???我才学到函数,有些语句没见过?比如fflush(stdin);就不明白的。。。有没有把fflush(stdin);删掉的写法???

[ 本帖最后由 可怜的C人 于 2013-11-19 10:09 编辑 ]
2013-11-19 10:03
jsyjzz
Rank: 2
等 级:论坛游民
帖 子:29
专家分:73
注 册:2013-11-8
收藏
得分:0 
我编写了个,直接初始化,不输入了,仅供参考:
 43 void array()
 44 {
 45         char a[3][3] = {{'a','b','c'}, {'d','e','f'}, {'g','h','i'}};
 46         char b[9]={0};
 47         int i, j, n=0;
 48         for(i=0; i<3 ;i++)
 49         {
 50                 for(j=0; j<3;j++)
 51                 {
 52                         b[n]=a[j][i];
 53                         n++;
 54                 }
 55         }
 56         b[n]='\0';
 57         printf("b[n]=%s\n", b);   
 58
 59 }
2013-11-19 10:52
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 6楼 可怜的C人
fflush(stdin);  这条语句的作用就是清空缓冲区
主要是针对字符输入,比如你循环输入字符,每输入一个按一下回车键,因为回车键也是字符,
所以若是缓冲区不清空的话,回车键会作为下一个字符键入,这可不是我们想要的结果

三十年河东,三十年河西,莫欺少年穷!
2013-11-19 12:05
可怜的C人
Rank: 1
等 级:新手上路
帖 子:18
专家分:2
注 册:2013-11-18
收藏
得分:0 
回复 8楼 韶志
哦 懂了 谢谢哈 引用了!!!嘿嘿 很谢谢你啊 !对了如果用我这样的算法,如果想不用那个语句应该怎么写?有空帮我想下哈。谢了。
2013-11-19 12:25
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:0 
回复 9楼 可怜的C人
这个是用字符指针来做的   输入比较简单
程序代码:
#include<stdio.h>
#include<stdlib.h>
void fun(char *p,int M,int N){
    int i,j;
    for(i=0;i<N;i++)
        for(j=0;j<M*N;j++)
            if(j%N==i)
                putchar(p[j]);
}
main()
{
    char *p;
    int M,N,i;
    printf("请输入行数M、列数N:");
    scanf("%d%d",&M,&N);
    printf("请输入%d个字符:",M*N);
    p=(char*)malloc((M*N+1)*sizeof(char));
    fflush(stdin);
    gets(p);
    for(i=0;i<M*N;i++){
        putchar(p[i]);
        if(i%N==N-1)
            printf("\n");       
    }
    fun(p,M,N);
    printf("\n");
    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册


三十年河东,三十年河西,莫欺少年穷!
2013-11-19 13:30
快速回复:一个二维字符组转一维字符组问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029488 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved