2016-12-14 22 views
-1

私はASCIIの値を持つ整数配列を持っていると言います。整数配列からCプログラミングの文字列へ

int stringAscii = {"072", "101", "108", "108", "111", "032", 
        "087", "111", "114", "108", "100"}; 

と私は文字にASCII値を変換した文字列にそれらを組み合わせたい:

char *string = stringAsciiToString(stringAscii); 

printf("Output -> '%s'", string); 

//出力 - あなたがそのようになるだろうどのように> 'のHello World'

関数?これは私がこれまでに得たものです。

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

long int p,q,n,t,flag,e[100],d[100],temp[100],j,m[100],en[100],i; 
char msg[100]; 
int prime(long int); 
void ce(); 
long int cd(long int); 
void encrypt(); 
void decrypt(); 

int main() 
{ 
    p = 53; 
    q = 61; 
    printf("\nENTER MESSAGE\n"); 
    fflush(stdin); 
    scanf("%s",msg); 

    for(i=0;msg[i]!=NULL;i++) 
     m[i]=msg[i]; 
    n=p*q; 
    t=(p-1)*(q-1); 
    ce(); 

    encrypt(); 
    decrypt(); 

    strcpy(msg, ""); 

    for(i=0;en[i]!=-1;i++) { 
     strcpy(msg, concat(msg, en[i])); 
    } 

    printf("%s", msg); 

    return 0; 
} 

char* concat(const char *s1, const char *s2) { 
    char *result = malloc(strlen(s1)+strlen(s2)+1);        //+1 for the zero-terminator 
    strcpy(result, s1); 
    strcat(result, s2); 
    return result; 
} 

int prime(long int pr) 
{ 
    int i; 
    j=sqrt(pr); 
    for(i=2;i<=j;i++) 
    { 
     if(pr%i==0) 
     return 0; 
    } 
    return 1; 
} 

void ce() 
{ 
    int k; 
    k=0; 
    for(i=2;i<t;i++) 
     { 
      if(t%i==0) 
       continue; 
       flag=prime(i); 
      if(flag==1&&i!=p&&i!=q) 
      { 
       e[k]=i; flag=cd(e[k]); 
       if(flag>0) 
     { 
     d[k]=flag; 
     k++; 
     } 
     if(k==99) 
     break; 
     } 
    } 
} 

long int cd(long int x) 
{ 
    long int k=1; 
    while(1) 
    { 
     k=k+t; 
     if(k%x==0) 
     return(k/x); 
    } 
} 

void encrypt() 
{ 
    long int pt,ct,key=e[0],k,len; 
    i=0; 
    len=strlen(msg); 
    while(i!=len) 
    { 
     pt=m[i]; 
     pt=pt-96; 
     k=1; 
     for(j=0;j<key;j++) 
     { 
     k=k*pt; 
     k=k%n; 
     } 
     temp[i]=k; 
     ct=k+96; 
     en[i]=ct; 
     i++; 
    } 
    en[i]=-1; 
    printf("\nTHE ENCRYPTED MESSAGE IS\n"); 
    for(i=0;en[i]!=-1;i++) 
     printf("%c",en[i]); 
} 

void decrypt() 
{ 
    long int pt,ct,key=d[0],k; 
    i=0; 
    while(en[i]!=-1) 
    { 
     ct=temp[i]; 
     k=1; 
     for(j=0;j<key;j++) 
     { 
     k=k*ct; 
     k=k%n; 
     } 
     pt=k+96; 
     m[i]=pt; 
     i++; 
    } 
    m[i]=-1; 
    printf("\nTHE DECRYPTED MESSAGE IS\n"); 
    for(i=0;m[i]!=-1;i++) 
     printf("%c",m[i]); 
} 
+3

どのようにでしょうか?これはFree.comのためのCodersではありません。 – unwind

+0

C配列についてはhttps://en.wikibooks.org/wiki/C_Programming/Arraysを参照してください。データ型に関するセクションもあります。 – Andrew

+1

あなたが持っているものと試したものの[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。次に、それがどのように動作するかどうかを教えてください。 –

答えて

1

あなたstringAscii配列であると仮定すると:

int stringAscii[] = {72, 101, 108, 108, 111, 32, 
        87, 111, 114, 108, 100}; 

ではなく、次の2つの理由で誤っている

int stringAscii = {"072", "101", "108", "108", "111", "032", 
        "087", "111", "114", "108", "100"}; 

  • は、あなたのようにstringAscii[]を持っている必要がありますあなたの配列名。
  • 文字列" "を整数配列のメンバーとして使用することはできません。それはあなたが動的にmallocを使用してchar *stringためのスペースを割り当て、そして一度動的配列1にあなたのASCII整数値を追加することができますC.

におけるタイプの競合です。

最後に要求されたスペースはfreeです。このような

何かがあなたが始めるのに役立つでしょう:ここ

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

char *stringAsciiToString(int stringAscii[], const size_t size); 

int 
main(int argc, char *argv[]) { 
    int stringAscii[] = {72, 101, 108, 108, 111, 32, 
        87, 111, 114, 108, 100}; 

    const size_t size = sizeof(stringAscii)/sizeof(*stringAscii); 

    char *string = stringAsciiToString(stringAscii, size); 

    printf("Output -> '%s'\n", string); 

    free(string); 

    return 0; 
} 

char 
*stringAsciiToString(int stringAscii[], const size_t size) { 
    int i, slen = 0; 

    char *string = malloc((size+1) * sizeof(*string)); 
    if (!string) { 
     printf("Cannot allocate memory\n"); 
     exit(EXIT_FAILURE); 
    } 

    for (i = 0; i < size; i++) { 
     string[slen++] = stringAscii[i]; 
    } 
    string[slen] = '\0'; 

    return string; 
} 

出力:Demo

関連する問題