为什么字符串返回" @"或搞乱我的" Z"?

时间:2014-11-03 17:34:05

标签: c

char convertalphas(char s) {

switch (s){
    case 'A':
        return '0';
        break;
    case 'B':
        return '1';
        break;
    case 'C':
        return '2';
        break;
    case 'D':
        return '3';
        break;
    case 'E':
        return '4';
        break;
    case 'F':
        return '5';
        break;
    case 'G':
        return '6';
        break;
    case 'H':
        return '7';
        break;
    case 'I':
        return '8';
        break;
    case 'J':
        return '9';
        break;
    case 'K':
        return '10';
        break;
    case 'L':
        return '11';
        break;
    case 'M':
        return '12';
        break;
    case 'N':
        return '13';
        break;
    case 'O':
        return '14';
        break;
    case 'P':
        return '15';
        break;
    case 'Q':
        return '16';
        break;
    case 'R':
        return '17';
        break;
    case 'S':
        return '18';
        break;
    case 'T':
        return '19';
        break;
    case 'U':
        return '20';
        break;
    case 'V':
        return '21';
        break;
    case 'W':
        return '22';
        break;
    case 'X':
        return '23';
        break;
    case 'Y':
        return '24';
        break;
    case 'Z':
        return '25';
        break;
 }
}

int main()
{

char astring[10];
int i = 0;
int flag = 0;
int startedalpha = 0;
//check if there is a digit input or not
int nodigit = 0;
char cell[10];
int col;
scanf( "%s", &astring );
for ( i = 0; i < 10; ++i )
{
if(astring[i] != '\0') {

//check whether letter is capital or small
 if (astring[i] >= 65 && astring[i] <= 90)
 {
        startedalpha = 1;

        //printf( "%c\n", astring[i] );
        cell[i] = convertalphas(astring[i]);

        printf("cell is %s\n", cell);
 }

我尝试做的是连接所有转换以供日后使用。当我把&#34; AB&#34;它返回&#34; 01 @&#34;当我把&#34; Z&#34;它返回的不是&#34; 25&#34;。我不知道出了什么问题,但这让我发疯了!我希望能够输入&#34; ABZ&#34;它将我的所有值保存到变量单元格中。例如,&#34; ABZ&#34; &#34; 0125&#34;

谢谢!

我对这个论坛感到困惑。显然,我发布了这个问题,因为有些东西我不知道,而且我不是很多大师!那么,为什么我会得到-2?我已经发布了我试过的内容。我认为这是为了帮助不被居高临下!

感谢那些回复的人!

编辑 -

我将switch语句转换为int但现在如何连接变量单元格中的整数?

4 个答案:

答案 0 :(得分:1)

根据C标准(6.4.4.4字符常数)

  
      
  1. ...包含多个的整数字符常量的值   字符(例如,&#39; ab&#39;),或包含字符或转义序列   不映射到单字节执行字符的是   实施-defined.All
  2.   

从&#39; 10&#39;开始的所有函数返回值到了&#39; 25&#39;包含了imolementation定义,你可以得到你不希望得到的结果。

您需要编写一个声明为

的函数
char * convertalphas( const char *s );

或者

char * convertalphas( char *dest, const char *source );

顺便说一下,进行逆向转换很困难。例如&#34; 25&#34;意思?无论是&#34; CF&#34;或&#34; Z&#34;?:)

答案 1 :(得分:1)

我注意到的一件事是你有一个char返回功能,并返回除了char之外的其他东西,比如&#39; 10&#39;。它将返回一个意外的值。例如,您可以将此函数的返回值设置为整数。 所以它看起来像这样:

int convertalphas(char s) {
  switch (s){
    case 'A':
        return 0;
    case 'B':
        return 1;
    case 'C':
        return 2;
    case 'D':
        return 3;
    case 'E':
        return 4;

  return -1;
}

然后,在main函数中更改循环内部:

sprintf(auxvar, "%d", convertalphas(astring[i]);
for( jj = 0; jj < strlen(auxvar); jj++)
  cell[i++] = auxvar[jj];

我希望它能以某种方式帮助你! 祝你好运。

答案 2 :(得分:0)

除了字符'K'到'Z'返回的值(如其他人所述),使用cell

还有其他一些错误

从函数返回的每个字符都写入cell[],然后将cell打印为字符串。但是没有字符串终止符。您需要先用{0}填充cell[],或者在下一个字符

中写入0
cell[i] = convertalphas(astring[i]);
cell[i+1] = 0;

但问题是当char不是大写字母时会跳过cell[i]。您需要在cell[]

中维护单独的索引
cell[j++] = convertalphas(astring[i]);
cell[j] = 0;

另一个问题是cell[]对于最终的字符串终止符而言还不够长。您需要将其声明为

char cell[11];

答案 3 :(得分:0)

总结一下,您的问题是:

  1. char函数无法返回单个字符以外的任何内容。
    如果您尝试返回类似&#39; 12&#39;的内容,则只是根本不工作。您需要重新考虑您的算法。使用int实现这一点应该非常简单。

  2. 这是一项需要使用switch声明的家庭作业吗?如果没有,并且如果您按照建议返回int而不是char,那么简单的s-65就行了,您不需要78行{{1 }}

  3. 由于switchcell数组,char的每个元素也只能存储单个字符。
    目前还不是很清楚你想要实现什么,所以我会尝试以两种方式理解它:

    3.1。您希望将每个字符的值分别存储在单元格中 示例:对于输入&#34; ABZ&#34;,您希望cell为{0,1,25}。
    这很简单。将cell更改为cell数组,并使用int中的%d格式说明符输出它们。

    3.2您将printf视为字符串而不是字符数组,并为每个字符的值连接字符串。
    示例:对于输入&#34; ABZ&#34;,您希望cell为&#34; 0125&#34;,或者换句话说,{&#39; 0&#39;,&#39; 1&#39;,&#39; 2&#39;,&#39; 5&#39;}。这意味着您无法区分&#34; ABZ&#34;而且,正如其他人所指出的那样,&#34; AMF&#34; 如果这是你想要达到的目的,首先10个元素对于cell是不够的 - 每个字符必须单独存储,并且你不能存储&#34; 25&#34;作为单元格元素中的两个字符。

  4. 您可以为它分配21个元素(每个字母最多2个,终止cell个字节另外一个)。在每个字母表转换为'\0'中的值后,实现一个计数器和一些条件,一次填充int一个字符。例如,如果字母的值存储在cell

    val

    我将把这个实现留给循环作为练习...