【问题标题】:String Compare not working in C字符串比较在 C 中不起作用
【发布时间】:2012-12-03 20:59:17
【问题描述】:

我的程序中有一个函数,它应该接受莫尔斯电码输入,将其与字符串数组进行比较,并在找到匹配的莫尔斯电码后从相应字符串中返回一个字母。我终于设法让它运行而不会崩溃,但现在它总是返回错误的字母。例如 ... --- ... 应该返回 sos 但我得到的是 amb。我尝试通过打印出索引号、莫尔斯电码字符串和字母来测试它,它们都匹配了,所以我认为问题出在字符串比较上。

代码如下:

void morsetotext(char mor[])
{
     char alpha[]={"abcdefghijklmnopqrstuvwxyz1234567890 "};
     char *morse[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", 
     "..", ".---","-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", 
     "...", "-", "..-", "...-",".--", "-..-", "-.--", "--.","-----", ".----", 
     "..---", "...--", "....-",".....", "-....", "--...", "---..", "----." "/ "};
     char letter[8];
     char convert[250];
     int con_count=0;
     int let_count=0;
     int count=0;
     int index=0;
     int length=strlen(mor);

     while (count<length)
     {
           for(let_count=0; let_count<8 && mor[count]!=' '; let_count++)
           {
                            letter[let_count]=mor[count];
                            count++;
           }

           letter[let_count+1]='\0';

           index=0;
           while (strcmp (letter, morse[index])!=1)
           {
                 index++;
           }

           count++;

           printf ("%c", alpha[index]);
     } 
     return;
}

感谢您的帮助。

编辑:对不起,这是整个功能。

【问题讨论】:

  • 向我们展示letter的声明和定义。听起来可能是char,在这种情况下,您对strcmp 的调用是错误的。你的警告级别调高了吗?您是否忽略了任何警告?
  • 是的,问题显然出在字符串比较上……数十万程序员已经使用了数百万次没有问题的函数。阅读《编程第一法则》:codinghorror.com/blog/2008/03/…
  • 我的意思是我认为我可能用错了。我还在学习中,我希望更有经验的眼睛能帮助我找到问题。不过,谢谢您的礼貌回应。

标签: c string strcmp


【解决方案1】:
while (strcmp (letter, morse[index])!=1)

您可能指的是0,而不是1。或者直接说while (!strcmp(...))。

【讨论】:

    【解决方案2】:

    将 strcmp() 与 0 进行比较,而不是 1。该函数只会返回完全匹配的 0。阅读手册! :)

    【讨论】:

    • 如果你的意思是把它改成 while (strcmp (letter, morse[index]) !=0),我已经反复尝试过,它会导致程序崩溃。
    • @user1827962:有效的比较永远不会使程序崩溃,因此letter 是错误的类型,或者您将count 递增到morse 或alpha 的末尾。请回答我在评论中提出的问题。无论哪种方式,与 1 比较都是错误的,我可以向您保证 strcmp 没有损坏。
    • 如果你输入一个它无法识别的莫尔斯电码,程序也会崩溃,因为'index'会超出 morse[] 数组的末尾。
    【解决方案3】:

    此声明:

    letter[let_count+1]='\0';
    

    如果输入 (mor) 的长度为 8 个字符,则正在写入 letter[9]。

    您将字母声明为char letter[8];,因此唯一有效的指标是 [0] - [7]。

    分配给letter[9] 很可能导致您描述的段错误。

    在我看来,您希望字母最多包含 8 个数据字符,外加一个空终止符 (\0)。这表明您应该将其声明为 char letter[9];。

    【讨论】:

    • 这是段错误的来源。感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多