c功能,"大写"一个字符串

时间:2014-05-17 16:52:05

标签: c string loops uppercase

这是我的目标:

input:带有混合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);
}

我的问题是:

该功能在第一个&#39;空间停止。字符串中的字符。 我试图改变s [i]!=&#39; \ 0&#39;在&#39; for&#39;部分为i&lt; strlen(s)或仅适用于s [i],但我仍然得到相同的结果。

示例:qwerty - &gt; QWERTY,但qwerty - &gt; QWE

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

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

2 个答案:

答案 0 :(得分:4)

scanf仅使用%s修饰符扫描非空白字符。如果您想阅读字符串中的所有内容,则应使用fgets并将stdin作为第三个参数:

fgets(s, sizeof s, stdin);

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

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

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

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

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

您也可以在toupper()上使用ctype.h,但我想这是某种功课或练习。

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

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

答案 1 :(得分:0)

来自scanf

  

取值
      匹配不是空格字符的字节序列。应用程序应确保相应的参数是指向char,signed char或unsigned char数组的初始字节的指针,其大小足以接受序列和终止空字符代码,这些代码应自动添加。

这意味着,%s使用scanf读取字符串,直到遇到第一个空格字符。因此,您的函数仅将给定字符串转换为第一个空格。

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

char s[100];