从C

时间:2015-12-23 16:42:07

标签: c arrays string pointers

假设我有一个字符串数组,如下所示: Alphabet 如您所见,这是用#表示的字母。 该程序的目的是使用#。

显示一个字母(来自输入)

因此,如果输入= E,我将不得不打印E

如果字母不是beetwen [a-z]或[A-Z],我必须打印一个问号(用#制作)。 我们得到T:代码H的消息:字母的高度(行数),L:字母的长度,以及ROW:用#创建字母的行序列。

所以我实际上已经编写了一部分程序。 但我的问题不是如何解决这个问题。 事实上,我刚刚学会了指针(基本用法),我不明白如何在更复杂的方面处理它们(对我而言,它很复杂),方式。

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

/**
 * Auto-generated code below aims at helping you parse
 * the standard input according to the problem statement.
 **/
int main()
{
    int L;
    scanf("%d", &L); fgetc(stdin);
    int H;
    scanf("%d", &H); fgetc(stdin);
    char T[257];
    fgets(T, 257, stdin);

    char elements[H][sizeof(T)];
    char *pointer, *Pelements[H];

    pointer = T;

    for (int i = 0; i < H; i++) {

        char ROW[1025];
        fgets(ROW, 1025, stdin);
        // given by the program

        strcpy(elements[i], ROW);
        Pelements[i] = &elements[i];
        // now i got the address of every first character of a string
    }

    while(*pointer != '\0'){
      if(*pointer >='a' && *pointer <= 'z' || *pointer >='A' && *pointer <= 'Z'){
        int temp= ((*pointer) - 'A');
        if(temp <= 25){
          for(int i=0; i<H; i++){
            int index= temp*L; // getting the position where to start to print
            for(int j=0; j<L; j++){
              printf("%s " , *Pelements+index);
              Pelements[i]++; //could have used index++
            }
          }
        }
      }
      else{
          printf("?");
      } 
      pointer++;
    }
    return 0;
}

程序没有完成(我没有处理[a-z])实际上我只用大写字母测试它。

问题: 它不断返回“分段错误”,或者在随机位置给我#。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果我已经理解你想要完成什么,那么你的大部分代码都是无用的。这样:

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 128

int main()
{

    char *ROW[5] = {
        " # ##  #### ###### ### #### ### ##  # #### # ##  # ##  ###### ## ## ## ## #######   ",
        "# ## ##  # ##  #  #  # # #   ## ##  #### ## ## ## ## ##   # # ## ## ## ## #  #  #   ",
        "##### #  # ### ## # #### #   ### #  #### ## ### # ###  #  # # ## #### #  #  #  ##   ",
        "# # ###  # ##  #  # ## # # # ## ##  # ## ## ##   ### #  # # # ## ##### # # #        ",
        "# ###  #### ####  #### #### # # ##### ## # # #    ## ###  # ### # # ## # # ### #    ",
    };
    const int L = 3;  // why do you want to read those from stdin?
    const int H = 5;  // they depend on how you define your alphabet
    const int not_a_letter = 26; // "index" of ? in your alphabet
    const int space = 27;           // I added a space
//    char T[BUFSIZE];
//    fgets(T, BUFSIZE, stdin);
    char T[]= "Hello World!"; //better starting with something short. note what happens to the '!'
    for( int i = 0; i < H; i++) { // for every row
        char  * pch = T;
        int temp;
        while( *pch != '\0') {
            if( *pch >='A' && *pch <= 'Z' ) temp = *pch - 'A';
            else if ( *pch >='a' && *pch <= 'z') temp = *pch - 'a'; // I'll print only capitals...
            else if ( *pch == ' ') temp = space;
            else temp = not_a_letter;
            int index = temp * L; 
            printf("%.*s " , L, ROW[i]+index); // print L char of string ROW[i] starting from index
            pch++;
        }
        printf("\n");
    }

    return 0;
}

将打印出来:

# # ### #   #    #      # #  #  ##  #   ##  ###
# # #   #   #   # #     # # # # # # #   # #   #
### ##  #   #   # #     ### # # ##  #   # #  ##
# # #   #   #   # #     ### # # # # #   # #
# # ### ### ###  #      # #  #  # # ### ##   #

编辑:

我想补充一些注意事项。从stdin读取您的程序输入。我想这是一个要求,因为大多数在线编译器重定向文件的输入和输出,但每次输入所有变量都不是很方便,尤其是那些&#34; ## #### ### ...&#34;,所以我在程序中对它们进行了硬编码。我没有在字母之间添加额外的空格,所以我的L是3,但是在你发布的图片中他们做了,所以你的L是4。

你可以保持你的程序的那部分不变(主要是),但是我想指出一些事情。当您读取T时,为256个字符分配足够的空间,通常consolle屏幕大约为80列,因此当在stdout上打印时,大于20个字符(80/4;)的字符串将被搞砸,除非输出被重定向到文件(可能)或你改变程序,以便它可以从T打印出一次只有20个字符。 然后你读了&#34;字体&#34;使用足够大的缓冲区(ROW)包含256个放大字符(256 * 4 = 1024;),这是整个ASCII集。当然,我只使用大写字母,但问题是如果他们给你所有的角色你不需要一个临时变量来将指数转移到正确的范围,否则你不需要所有那个空间。你应该检查一下这是什么情况。 分配内存后,您可以直接读入ROW:

#define BUFSIZE 1025

char **ROW = malloc(H*sizeof(char*));
for (int i = 0; i < H; i++) {

    ROW[i] = malloc(BUFSIZE);
    fgets(ROW[i], BUFSIZE, stdin);

}

请务必在关闭程序前释放内存:

for (int i = 0; i < H; i++) {
    free(ROW[i]);
}
free(ROW);

答案 1 :(得分:0)

我认为你的问题在这里:

int index = temp*L; 

从您的代码temp可以最多25个,在L的输入中例如是char A(64),您的索引将是1600,我认为更大而不是Pelements尺寸。

我无法判断这是否会解决您的整个问题,但它可能会让您解决第一个问题。