这是我的目标:
输入:包含混合 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
修饰符扫描非空白字符。如果你想读取字符串中的所有内容,你应该使用 fgets
和 stdin
作为第三个参数:
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/