【问题标题】:C code doesn't work with but no errorsC 代码不起作用但没有错误
【发布时间】:2014-05-03 09:33:10
【问题描述】:

我正在编写以下代码来反转字符串,而不反转单词。例如 I/P:这是斯巴达 O/P:斯巴达就是这个

代码如下:

#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();
}   

此代码运行时没有错误,但在接受字符串后,它根本不会走得更远。终端有点挂了。我不知道有什么问题。请帮忙。

【问题讨论】:

  • 你为什么用%[^\n]s来阅读?
  • 您有两个for 循环,在其中任何一个中都没有停止条件,您期望什么???
  • 当然是读取字符串。我什至使用了gets()。但是遇到了同样的问题
  • 它在循环内部中断,这就是为什么? @barakmanos
  • a[i]==' ' 没有改变代码,当 a[i] : ' '.

标签: c string logic


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    当 a[i] 等于 ' ' 时,上述循环在 i=4 处中断。 稍后执行 goto 后,i 仍然是 4,当

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • s 代表string 而不是文字's' ?? AFAIK,"%[^\n]s" 只是一部分 - 与表达式 [^\n] 匹配的字符串。我可能是错的。
      • @ArjunSreedharan:你错了。 "%s" 代表字符串; "%[...]" 代表扫描集; "%[...]s" 代表扫描集,后跟文字 's'。见pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html
      • 我尝试删除 scanf 并尝试使用gets函数。问题依然存在。
      • 没有。一旦找到换行符,scanf() 调用就会终止。它不寻找s。很可能是scanf("%[^\n]Hi Good morning from UK",a);
      • 我会使用if (scanf("%49[^\n]", a) != 1) /* error */; 来防止缓冲区溢出并检测输入数据中的错误。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 2020-05-19
        • 1970-01-01
        相关资源
        最近更新 更多