C代码不起作用但没有错误

时间:2014-05-03 09:33:11

标签: c string logic

我正在编写以下代码来反转字符串,而不会反转单词。对于例如 I / P:这是sparta O / P:sparta是这个

以下是代码:

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

void main()
{   
    char a[50],b[50];
    int i,j,k,l;
    printf("Enter a string: ");
    scanf("%[^\n]s",a);
    l=strlen(a);
    i=0;j=l-1;
ae: 
    for(i;;i++)
        if(a[i]==' ' || a[i]=='\0')
            break;
    k=i;
    for(j;;j--,k--)
    {
        if(a[k]==' ' || k==0)
            break;
        else
            b[j]=a[k-1];
    }
    if(strlen(b)!=l) goto ae;
    else 
        printf("%s",b);
    getch();
}   

此代码运行时没有错误,但在接受字符串后,它根本没有进一步发展。终端有点被绞死了。我不知道这个问题是什么。请帮忙。

4 个答案:

答案 0 :(得分:1)

如果输入的字符串包含空格,则这是一个无限循环。

  1. 遍历字符串a,直到a[i] == ' '
  2. k = i;
  3. 立即退出第二个for循环,因为a[i] == ' 'k == i隐含a[k] == ' '
  4. b未初始化,但strlen(b) != l概率很高,因此将采用分支goto ae;并关闭无限循环。

答案 1 :(得分:0)

scanf("%[^\n]s",a);中的格式字符串由两部分组成:"%[^\n]""s"

第一部分需要一系列不同于'\n'的字符,并将它们写入相应的地址。

第二部分需要文字's'并丢弃它。

输入“This is sparta \ n”时,scanf()不会终止。它仍在寻找's'

答案 2 :(得分:0)

您无法安全使用strlen(b),因为b中的字符未初始化为0.

首先,将b[50]更改为b[50] = {0}

答案 3 :(得分:0)

我调试了你的程序,我发现的问题是你的程序正在进入一个永无止境的循环。

for(i;;i++)
    if(a[i]==' ' || a[i]=='\0')
        break;

当a [i]等于&#39;时,上述循环在i = 4时断开。 &#39 ;. 执行goto后,我仍然是4,当时

if(a[i]==' ' || a[i]=='\0')
        break;

被评估我仍然是4,因此再次从循环中断开。因此导致无限循环。