【问题标题】:C code doesn't work, but no errors shownC 代码不起作用,但没有显示错误
【发布时间】:2014-05-02 17:15:41
【问题描述】:

当我遇到这个障碍时,我正在准备我的计算机科学实践考试。 下面的 C 代码是将取自用户的字符串中的所有单词大写。

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

int main()
{
    char a[20];
    int i;
    printf("Enter a string: ");
    scanf("%[^\n]s",a);

    if(islower(a[0])!=0)
    {
        a[0]=toupper(a[0]);
    }

    for(i=0;i<strlen(a);i++)
        if(a[i]==' ' && isalpha(a[i+1]!=0))
            a[i+1]=toupper(a[i+1]);

    printf("%s\n",a);
    return 0;
}

但是上面的代码并没有执行任务。它接受输入,但给出相同的输出(输入的字符串,原样)。此外,没有显示错误或警告。我正在使用 gcc 在 Ubuntu 14.04 中编码。我似乎不明白为什么代码不起作用。

【问题讨论】:

  • 学习使用调试器(本例中为 gdb)
  • 由于toupper 将在没有大写等价的情况下返回传入的值,因此此代码可以相当简单。如果您希望扩展 ascii 也能正常工作,您应该考虑在对 toupper 的调用中转换为 unsigned char。并且请不要更改发布的代码以响应给出的答案。您刚刚所做的更改,if(islower(a[0])!=0) 只是让 Pat 的答案在现在发布的代码上下文中毫无意义。

标签: c string logic ctype


【解决方案1】:

你应该阻止:

if(islower(a[0])==0)
{
   a[0]=toupper(a[0]);
}

正在检查它是否不等于零而不是零?

【讨论】:

  • 这个块检查字符串的第一个字母是否小,如果是,则将其转换为大写。
  • 是的,但是如果字母不是小写,islower(a[0]) 返回 0。我将其读为:如果大写 -> 转换为大写。我认为你需要一个 != 0 而不是 a == 0
【解决方案2】:

您的错误在于isalpha(a[i+1]!=0),因为您只需检查isalpha(a[i+1])。对于输入字符串中的所有字符,表达式a[i+1]!=0 的返回值为1,最后一个字符除外。 isalpha(1)的返回值为0,所以if条件下的语句将only对最后一个字符执行,only如果该字符在前面通过空格字符。

话虽如此,这里有一个更好的方法来实现整个事情:

for (i=1; a[i]!=0; i++)
    if (a[i-1]==' ' && isalpha(a[i]))
        a[i] = toupper(a[i]);

【讨论】:

  • @Neil:您尝试了第一个建议还是扩展建议?
  • 我之前尝试过第一个答案,但扩展后的答案可以正常工作。谢谢。
  • @Neil:不客气 :) 请查看更新后的答案,其中包括对原始问题的解释。
【解决方案3】:

检查 isalpha(a[i+1]!=0)) 中的第一个 ),它放错了位置。

for(i=0;i<strlen(a);i++)
    if(a[i]==' ' && isalpha(a[i+1])!=0)
        a[i+1]=toupper(a[i+1]);

也是第一个if应该是

if(islower(a[0]){}

【讨论】:

  • 没错。这些是所需的更改。谢谢@halfdreamer。
猜你喜欢
  • 1970-01-01
  • 2021-06-06
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多