【问题标题】:c function, that "uppercasing" a stringc 函数,即“大写”一个字符串
【发布时间】:2014-05-17 16:52:04
【问题描述】:

这是我的目标:

输入:混合 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);
}

我的问题是:

函数在字符串中的第一个“空格”字符处停止。 我试图将 'for' 部分中的 s[i] != '\0' 更改为 i

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

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

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

【问题讨论】:

  • 两个友好的建议:1)不要使用void main(),使用int main(),如标准所说; 2) 您可能想使用ctype.h 中的toupper(character) 将字符变为大写。
  • 第三个:用英语编写和注释您的代码(csere 是匈牙利语,请改用swapchangecase
  • @PeterVaro!感谢您的建议。

标签: c string loops uppercase


【解决方案1】:

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(),但我想这是某种家庭作业或练习。

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

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

【讨论】:

  • 谢谢!它适用于 fgets()。我也更改了最大字符串大小。 (我只是不明白,为什么它使用 0 或 1 作为大小。)
  • 巧合...您正在写入未分配的内存。只要(出于巧合)你没有在你正在崩溃的地方写东西(之前分配的内存的其余部分没有被任何程序使用并且不受保护),它应该可以工作
  • 再次感谢您!我想,我现在明白“巧合”了。
  • 如果答案很好,请接受它作为答案...这也会将此问题标记为“已回答”(点击答案分数下方的勾号)。
【解决方案2】:

来自scanf

s
匹配不是空白字符的字节序列。应用程序应确保相应的参数是指向 char、signed char 或 unsigned char 数组的初始字节的指针,该数组大到足以接受序列和终止的空字符代码,应自动添加。

这意味着,对于%sscanf 会读取一个字符串,直到遇到第一个空白字符。因此,您的函数只将给定的字符串转换为第一个空格。

对于第二个(较小的)问题,数组s 必须足够大以容纳给定的整个字符串。否则,您将覆盖堆栈空间并获得未定义的行为。如果您期望更大的字符串,则必须增加 s 的大小,例如

char s[100];

【讨论】:

    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多