c函数,表示 "uppercasing"一个字符串

标签 c string loops uppercase

这是我的目标:

输入:包含混合 ASCII 字符(大写、小写、数字、空格)的字符串

输出:只有大写字符的字符串

我有这个:

#include <stdio.h>

void csere(char s[]){
    int i;
    for(i=0; s[i]!='\0'; i++){
        if('a'<=s[i] && s[i]<='z'){
            s[i]-=32;
        }
        printf("%c", s[i]);
    }
}

void main(){
    char s[1];
    scanf("%s", &s);
    csere(s);
}

我的问题是:

该函数在字符串中的第一个“空格”字符处停止。 我试图改变 s[i] != '\0' 在 'for' 部分 for i < strlen(s) 或仅用于 s[i],但我仍然得到相同的结果。

示例:qwerty --> QWERTY,但是 qwe rty --> QWE

(较小的问题:如果我在 main 函数中将 1 更改为 0,则程序只接受长度小于 12 的字符串。)

感谢您的帮助。抱歉英语不好。

最佳答案

scanf 仅使用 %s 修饰符扫描非空白字符。如果你想读取字符串中的所有内容,你应该使用 fgetsstdin 作为第三个参数:

fgets(s, sizeof s, stdin);

如果你真的需要使用 scanf 做作业或其他事情,你应该使用类似的东西:

scanf("%128[^\n]", s);

此外,请注意您没有为字符串分配足够的空间,它没有崩溃的事实纯属巧合......您应该在数组上分配空间:

char s[128]; // change 128 for max string size

实际上,我之前写的 fgets() 用法只会读取 1 个字符(包括终止符字符串),因为您只将 1 个字符放在数组上...更改数组大小,它应该工作。

您也可以只在 ctype.h 上使用 toupper(),但我想这是某种家庭作业或练习。

此外,如果您被允许使用指针,这将是一种更短的方式(并且可能性能更高,尽管必须进行测试......这些天编译器很好 :-) )转换为大写的方式(注意虽然它改变了你原来的字符数组,并且不打印它,虽然这很容易修改/添加,但我会把它留给你):

void strupper(char *sptr) {
  while (*sptr) {
    if ((*sptr >= 'a' ) && (*sptr <= 'z')) *sptr -= 32;
    sptr++;
  }
}

关于c函数,表示 "uppercasing"一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713874/

相关文章:

java - 将大流复制到字符串 - Java

python - 如何使用 python 中的循环创建多个目录?

javascript - 使用 JavaScript 中的 switch 循环更改背景颜色

c - Lint 警告 : #647: Suspicious truncation

c# - C# 中的可变字符串和不可变字符串有什么区别?

C++反向字符串递归

ios - 按钮状态不会循环更改

c - 多态结构的内存偏移错误

c - 将结构数组传递给函数

c - 从 C 调用的 Powershell 脚本不会打开 OleDb 连接