【问题标题】:Converting a char string into ASCII numbers and then separate the ASCII numbers & convert it into a 2d array using C language将 char 字符串转换为 ASCII 数字,然后分离 ASCII 数字并使用 C 语言将其转换为二维数组
【发布时间】:2022-01-03 09:58:29
【问题描述】:

我想制作一个程序,将我的字符串输入(char)转换为 ASCII 数字,然后分离 ASCII 数字并将其转换为二维数组,然后像这样在输出中显示二维数组。

输入:有趣 (str 是我用于输入的字符串的名称)

//The string char input
str = fun

然后程序将输入(字符串 char)转换为 ASCII 数字。 (ascii 是我用于 ASCII 数字的数组/字符串的名称)

//ASCII numbers for 'fun' (f u n)(left to right)
ascii = 102 117 110

注意:102 是 ASCII 中的字母“f”,117 是 ASCII 中的字母“u”,110 是 ASCII 中的字母“n”。

然后,程序分离 ASCII 数字并将其转换为二维数组。 ('asc' 是二维数组的名称)

//ASCII for letter 'f'
asc[0][0] = 1
asc[0][1] = 0
asc[0][2] = 2

//ASCII for letter 'u'
asc[1][0] = 1
asc[1][1] = 1
asc[1][2] = 7

//ASCII for letter 'n'
asc[2][0] = 1
asc[2][1] = 1
asc[2][2] = 0

输出:1-0-2--1-1-7--1-1-0

这是该程序的输入和预期输出:

    Input: fun
    Output: 1-0-2--1-1-7--1-1-0

这是我制作的完整代码:

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

int main(){

char str[50];
printf("Input: ");
scanf("%s", &str); //string input

int i;
int ascii[50];
for(i = 0; i < strlen(str); i++){
    ascii[i] = str[i]; //converting string to ascii
}

int x, y;
int asc[50][3];
for(x = 0; x < strlen(str); x++){
    for(y = 0; y = strlen(str); y++){
        asc[x][y] = ascii[x]; //separate ascii to 2d array
    }
}

printf("Output: ");
for(x = 0; x < strlen(str); x++){
    for(y = 0; y < strlen(str); y++){
        printf("%d", asc[x][y]); //showing the result of separation/conversion
        printf("-");
    }
}

return 0;
}

你能告诉我代码有什么问题吗?它不输出想要/预期的结果。相反,输入永远循环(输入不会停止)。提前感谢您为我提供解决此问题的方法!

(注意:程序仅限于只能使用两个头文件(stdio.h和string.h)。程序也仅限于只能使用三个str函数(strcpy,strcmp,strlen)(多少它在程序中是无限的。)。我也不能使用gets、puts、define等。)

【问题讨论】:

  • “输入永远循环”和“输入不会停止”究竟是什么意思?请给出准确的运行日志。
  • 注意:这个程序我只能使用基本功能

标签: c for-loop multidimensional-array ascii c-strings


【解决方案1】:

你认为这部分代码会做什么:

for (x = 0; x < strlen(str); x++) {
    for (y = 0; y = strlen(str); y++) {
        asc[x][y] = ascii[x]; //separate ascii to 2d array
    }
}

首先,你应该注意到,如果你输入funny,当内部数组被声明为3的大小时,strlen(str)将是5。所以这暗示了可能存在错误。 ..

接下来,您想要进行以 10 为底的分解,因此我希望您的代码中不会出现除数和余数 10。

请记住:这里最好的朋友是一张纸和一支铅笔。用伪代码或简单地用数学运算符手工写下你想做的事情。我期望:

  • 模 10 运算(每个字符至少 2 次)
  • 除以 10 运算(每个字符至少 2 次)

一旦这部分完成(并且只有到那时),就该回到你的键盘了...

【讨论】:

  • 我已经尝试回答了代码有什么问题?这个问题,但不是直接给你正确的代码。恕我直言,如果您自己找到它,您将了解更多...
【解决方案2】:

首先是scanf这个调用的参数类型

scanf("%s", &str);

不正确。你至少需要写像

scanf("%s", str);

这个数组声明和对应的for循环

int i;
int ascii[50];
for(i = 0; i < strlen(str); i++){
    ascii[i] = str[i]; //converting string to ascii
}

是多余的。您可以直接使用数组

int asc[50][3];

还有这个说法

ascii[i] = str[i];

应该像这样重写

ascii[i] = ( unsigned char )str[i];

这些嵌套的 for 循环

for(x = 0; x < strlen(str); x++){
    for(y = 0; y = strlen(str); y++){
        asc[x][y] = ascii[x]; //separate ascii to 2d array
    }
}

printf("Output: ");
for(x = 0; x < strlen(str); x++){
    for(y = 0; y < strlen(str); y++){
        printf("%d", asc[x][y]); //showing the result of separation/conversion
        printf("-");
    }
}

无效,因为数组asc 的第二个索引必须在[0, 3 ) 范围内。

程序可以如下所示

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

int main( void )
{
    enum { N = 50 };
    char s[N];
    s[0] = '\0';

    printf( "Input: " );
    scanf( "%49s", s );

    size_t n = strlen( s );

    unsigned char a[n][3];
    
    for ( size_t i = 0; i < n; i++ )
    {
        const unsigned char Base = 10;
        
        memset( a[i], 0, sizeof( a[i] ) );
        unsigned char c = s[i];
        
        for ( size_t j = sizeof( a[i] ); c; c /= Base )
        {
            a[i][--j] = c % Base + '0';
        }
    }
    
    for ( size_t i = 0; i < n; i++ )
    {
        if ( i != 0 ) 
        {
            putchar( '-' );
            putchar( '-' );
        }
        
        for ( size_t j = 0; j < sizeof( a[i] ); j++ )
        {
            if ( j != 0 ) putchar( '-' );
            putchar( a[i][j]  );
        }
    }
    
    putchar( '\n' );
}

程序输出可能是

Input: fun
1-0-2--1-1-7--1-1-0

【讨论】:

  • 枚举、size_t、unsigned char、const、memset、sizeof 和 putchar 有什么替代品吗?因为我也不能在程序中使用它
  • @TheRealF6 size_t 是您正在使用的函数 strlen 的返回类型。所以你不能使用它听起来很奇怪。请改用 int 类型。 memset 可以代替 for 循环。
  • 我不能使用该功能,因为这是程序的要求。我只能使用基本功能。
  • 我认为我也不能使用 int 类型。我不能使用我没有学过的东西。
  • @TheRealF6 你的 cmets 没有意义。您已经在程序 int x, y; 中使用了 int 类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2011-10-03
  • 1970-01-01
  • 2015-03-29
  • 2015-02-01
  • 2013-02-08
  • 1970-01-01
相关资源
最近更新 更多