C代码不';不工作,但没有错误

C代码不';不工作,但没有错误,c,string,logic,C,String,Logic,我正在编写以下代码来反转字符串,而不反转单词。例如。 我是斯巴达 这是斯巴达吗 代码如下: #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);

我正在编写以下代码来反转字符串,而不反转单词。例如。 我是斯巴达 这是斯巴达吗

代码如下:

#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();
}   
#包括
#包括
#包括
void main()
{   
字符a[50],b[50];
int i,j,k,l;
printf(“输入字符串:”);
scanf(“%[^\n]s”,a);
l=斯特伦(a);
i=0;j=l-1;
ae:
对于(i;;i++)
如果(a[i]=''|a[i]='\0')
打破
k=i;
对于(j;;j--,k--)
{
如果(a[k]=''|k==0)
打破
其他的
b[j]=a[k-1];
}
如果(strlen(b)!=l)转到ae;
其他的
printf(“%s”,b);
getch();
}   

这段代码运行时没有错误,但在接受字符串后,它就不会再进一步了。航站楼有点被吊死了。我不知道有什么问题。请帮助。

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

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

第二部分需要一个文本
's'
,并丢弃它


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

您不能安全地使用
strlen(b)
,因为
b
中的字符未初始化为0


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

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

  • 迭代字符串
    a
    ,直到
    a[i]=''
  • k=i
  • 立即中断第二个
    for
    循环,因为
    a[i]='
    k==i
    意味着
    a[k]='
  • b
    未初始化,但
    strlen(b)!=l
    极有可能为真,因此分支
    转到ae,无限循环闭合

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

    for(i;;i++)
        if(a[i]==' ' || a[i]=='\0')
            break;
    
    当[i]等于“”时,上述循环在i=4处中断。 后来后藤被执行后,我还是4岁,什么时候

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

    被计算的i仍然是4,因此再次从循环中断。从而导致一个无休止的循环。

    为什么要使用
    %[^\n]s
    读取?您有两个
    for
    循环,其中任何一个循环都没有停止条件,您希望读取字符串是什么。我甚至用过gets()。但同样的问题是循环内部的ecounteredIt中断,这就是为什么@barakmanos
    a[i]='
    no change codition,当a[i]:''时,
    s
    不代表
    string
    而不是字面
    's'
    ??好的,
    “%[^\n]s”
    只是与表达式
    [^\n]
    匹配的一部分字符串。我可能错了。@ArjunSreedharan:你错了<代码>“%s”
    代表字符串
    “%[…]”
    代表扫描集
    “%[…]s”
    表示扫描集,后跟文字
    's'
    。请看,我尝试删除scanf并尝试使用get函数。这个问题仍然存在。只要找到换行符,scanf()调用就会终止。它不查找
    s
    。它很可能是
    scanf(“%[^\n]你好,早上好,来自英国”,a)。如果(scanf(“%49[^\n]”,a)!=1)/*错误*,我将使用
    以防止缓冲区溢出并检测输入数据中的错误。