C中的字符串:给出一些逻辑错误

时间:2013-01-21 06:30:25

标签: c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
char output[17]={0};
const char* change_mac(char ch[100])
{
    int i = 0;
    int k = 0;

    bool flag = false;
    while(i < strlen(ch)) 
    {
        flag = false;
        int j = 0;
        while (j < 2)
        {
            if(ch[i] == ':' || strlen(ch) == i ) 
            {
                if(k != 0) 
                {
                    char temp = output[k-1];
                    output[k-1] = '0';
                    output[k] = temp;
                }
                flag = true;
            } 
            else 
            { 
                output[k] = ch[i];
            }
            i++;
            j++;
            k++;
        }
        if(i < strlen(ch) && memchr(ch, ':', strlen(ch)))
        {
            output[k] = ':';
            output[k+1] = '\0';
        }
        else{
            output[k] = ch[i];
        }
        k++;
        if(!flag) 
        {
            i++;
        }
    }

    output[k-1] = 0;
   return output;
}



int main(int argc,char **argv)
{
char name[]="";
char ch[100] = "0:0:0:0:0:0";

if(sscanf(argv[1],"%s",ch) == 1)
{
  name=change_mac(ch);
} 
return 0;
}

/ 我想要获得MAC作为CMD线争论将其更改为正确的格式并将其存储到此“名称”变量中所以我可以在这里进一步使用它显示一些类型转换错误 /

/ *执行:./ a.out 0:c:f4:dr:4r:1 * /

3 个答案:

答案 0 :(得分:4)

您忘了在'\0'的末尾添加output[]。在printf("%s\n",output);之前添加以下代码:

output[k-1] = '\0';    

下,
我不太确定,但如果代码如下,第二个功能会改变你:

if(i !=sizeof(ch))
{
    output[k] = ':';
}

跟随(仅在':' 中存在时添加ch[]

if(i !=sizeof(ch) && memchr(ch, ':', sizeof(ch)))
{
     output[k] = ':';
}
else{
    output[k] = ch[i];
}  

并包含头文件string.h

试一试!!如果您有其他疑问,请告诉我。

但是,是的,它不像你想要“尝试捕捉或错误处理”

修改
正如你在我的回答中评论的那样,我正在解决你的错误:
printf("%s\n",output);

之前添加以下代码
output[k-1] = 0;
if(memchr(ch, ':', sizeof(ch))==NULL){
        output[k-2] = 0;
} 

阳离子:这是修复此类错误的好方法,建议您重写代码

答案 1 :(得分:1)

你以错误的方式改变了你的问题:(

我已更正您的代码,如下所示:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    //char ch[] = {'0',':','1','0',':','1',':','C',':','B','F',':','9','8'};
    char ch[] = {'a','b','c','d','e','f','g','f'};
    char output[20]={0};
    int i = 0;
    int k = 0;
    bool flag = false;

    while(i < sizeof(ch)) 
    {
        flag = false;
        int j = 0;
        while (j < 2)
        {
            if(ch[i] == ':') 
            {
                if(k != 0) 
                {
                    char temp = output[k-1];
                    output[k-1] = '0';
                    output[k] = temp;
                }
                flag = true;
            } 
            else 
            { 
                output[k] = ch[i];
            }
            i++;
            j++;
            k++;
        }
        if(i !=sizeof(ch) && memchr(ch, ':', sizeof(ch)))
        {
            output[k] = ':';
            output[k+1] = '\0';
        }
        else{ // added this else in your code
            output[k] = ch[i];
        }
        k++;
        if(!flag) 
        {
            i++;
        }
    }
    output[k-1] = 0;  // added this
    printf("%s\n",output);
    printf("%d\n",sizeof(ch));
    printf("%d\n",sizeof(output));

   return 0;
} 

它的工作好!

案例-1 如果char ch[] = {'a','b','c','d','e','f','g'};

~$ ./a.out 
abcdefg
8
20

案例-2 如果char ch[] = {'0',':','9',':','1',':','C',':','B',':','9','8'};

:~$ ./a.out 
00:10:01:0C:BF:98
14
20

虽然给代码不好,但是因为你从早上开始尝试我已经给了

答案 2 :(得分:0)

你的问题已经改变太多了:

您通过参数进行代码传递:

#include<stdio.h>
#include <string.h>
#include<stdlib.h>
void function(char* ch);
int main(int argc, char* argv[]){
    if(argc!=2){
        printf("\n wrong number arguments!\n");
        exit(0);
    }
    function(argv[1]);
    return 0;
}
void function(char* ch){
    char output[20]={0};

    int i = 0;
    int k = 0;
    bool flag = false;

    while(i < strlen(ch)) 
    {

        flag = false;
        int j = 0;

        while (j < 2)
        {
            if(ch[i] == ':') 
            {
                if(k != 0) 
                {
                    char temp = output[k-1];
                    output[k-1] = '0';
                    output[k] = temp;
                }
                flag = true;
            } 
            else 
            { 
                output[k] = ch[i];
            }
            i++;
            j++;
            k++;
        }

        if(i !=strlen(ch) && memchr(ch, ':', strlen(ch)))
        {
            output[k] = ':';
            output[k+1] = '\0';

        }
        else{
            output[k] = ch[i];
        }
        k++;

        if(!flag) 
        {
            i++;
        }
    }
    output[k] = 0;

    /*for (i=0;i<sizeof(output);i++)
    {
        printf("%c", output[i]);
    }*/

    printf("%s\n",output);
} 

运行此代码:

案例1

~$ ./a.out  abcderf
abcderf

案例-2

:~$ ./a.out  0:9:1:C:B:98
00:09:01:0C:0B:98