这是我的目标:
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的字符串。)
感谢您的帮助。抱歉英语不好。
答案 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];