将小写字母转换为大写字母

3

我想将小写字符串转换为大写字符串。 但是出现了错误(访问冲突)。 该怎么办?

int main()
{
    char str[10];
    int i=0;
    scanf("%s", &str);
    while (str[i] !=0)
    {
        str[i] += -32;
        printf("%s", str[i]);
    }
    return 0;
}

thx


1
如果这是作业,请标记为作业。 - MByD
除了你的错误,你没有增加i --> 无限循环 - das_weezul
1
不能保证所有系统上的所有字母都是按顺序排列的。在我所在的地方,我们认为åäö是有效的字母。 - Bo Persson
1
我喜欢 += -32 !! 我会写成 - = 32 :) - pmg
7个回答

5
  1. 如果您输入的字符串超过9个字符,scanf()将尝试写入超出您的字符串缓冲区的范围。

  2. 由于您从未更改i,因此您的while循环永远不会终止。

  3. 由于您正在写入字符而不是以null结尾的字符串,因此在printf()调用中应使用"%c"作为格式字符串。


我不明白,我输入的字符串少于9个字符,但它仍然无法工作。 - yEL155
1
@yEL155:我列出了你代码中的几个错误。你修复了第一个,但它仍然无法工作。也许考虑修复剩下的错误吧... - Sven Marnach
scanf("%s", &str); 无论如何都不正确,详见下面的答案。 - MByD

2
int main()
{
    char str[10];
    int i=0;
    scanf("%s", str);
    while (str[i] != 0)
    {
        str[i] += -32;
            i++;
    }
    printf("%s", str);
    return 0;
}

当然,你必须检查字符串的溢出情况...


2
正如 cprogrammer 所说

You better use toupper

/* toupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    putchar (toupper(c));
    i++;
  }
  return 0;
}
但是如果你不想按照现有方式进行,而是想按照自己的方式进行。
int main()
{
    char str[10];
    int i=0;
    scanf("%s", &str);
    while (str[i]!='\0' && i<10)  
    {// You forgot this: '\0' instead of 0 and also i<10
        str[i] += -32;
        printf("%c", str[i]);//char, not string
        i++; //And this
    }
    return 0;
}

1

这里有几个错误:

  1. scanf("%s", &str); - 由于str是一个指向char的指针,你不需要给它地址,而是使用scanf("%s", str);。(正如Sven所说,这是不安全的)
  2. while (str[i] !=0) 这是一个无限循环,你应该在while块的末尾增加i
  3. str[i] += -32; 将修改任何你正在处理的字符,你应该检查这是否是小写字母,例如:

    if (str[i] >= 'a' && str[i] <= 'z'){ str[i] -=32; } //由于某种原因,我无法格式化此行....

  4. printf("%s", str[i]) 再次错误地使用printf,因为%s期望char*,而str[i]是一个char。相反,使用printf("%c", str[i]),它期望一个char


0

你最好使用toupper

/* toupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    putchar (toupper(c));
    i++;
  }
  return 0;
}

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

void main();
{
    int i, count;
    char str[200];
    clrscr();
    printf("Enter a string");
    scanf("%s", str);
    count = strlen(str);
    for(i=0; i<=count; i++)
    {
        if((str[i] >= 97) && (str[i] <= 122))
        {
            str[i] = str[i] - 32;
        }
    }
    printf("%s", str);
    getch();
}

请尽量避免只回答代码,添加一些解释以提高答案质量。 - Dreen

0

您可以使用 按位与&)运算符的技巧将小写字母转换为大写字母。

char ch = letter & 223; [letter = a-z] // Now ch is all time capital letter

厉害的技巧。 - Sazal Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接