c函数,即;上套管;一串
这是我的目标: 输入:混合ASCII字符的字符串(大写、小写、数字、空格) 输出:仅包含大写字符的字符串 我有这个:c函数,即;上套管;一串,c,string,loops,uppercase,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"
#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);
}
#包括
void csere(字符s[]{
int i;
对于(i=0;s[i]!='\0';i++){
如果('a'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){
而(*sptr){
if((*sptr>='a')&(*sptrscanf
仅使用%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){
而(*sptr){
如果((*sptr>='a')&(*sptr来自
s
匹配非空白字符的字节序列。应用程序应确保相应的参数是指向字符、有符号字符或无符号字符数组的初始字节的指针,该数组的大小足以接受该序列和终止的空字符代码,并应自动添加
这意味着,使用%s
,scanf
读取字符串,直到遇到第一个空格字符。因此,函数只将给定字符串转换为第一个空格
对于第二个(较小的)问题,数组s
必须足够大以容纳给定的整个字符串。否则,您将覆盖堆栈空间并获得未定义的行为。如果您希望字符串更大,则必须增加s
的大小,例如
char s[100];
从
s
匹配非空白字符的字节序列。应用程序应确保相应的参数是指向字符、有符号字符或无符号字符数组的初始字节的指针,该数组的大小足以接受该序列和终止的空字符代码,并应自动添加
这意味着,使用%s
,scanf
读取字符串,直到遇到第一个空格字符。因此,函数只将给定字符串转换为第一个空格
对于第二个(较小的)问题,数组s
必须足够大以容纳给定的整个字符串。否则,您将覆盖堆栈空间并获得未定义的行为。如果您希望字符串更大,则必须增加s
的大小,例如
char s[100];
两个友好的建议:1)不要使用void main()
,按照标准使用int main()
;2)您可能需要使用ctype.h
中的toupper(character)
来生成大写字符。第三个建议:用英语编写和注释代码(csere
是匈牙利语,请改用swap
或changecase
)@PeterVaro!谢谢你的建议。两个友好的建议:1)不要使用void main()
,按照标准使用int main()
;2)你可能想使用toupper(字符)
从ctype.h
生成一个大写字符。第三个:用英语编写和注释代码(csere
是匈牙利语,使用swap
或changecase
替换)@PeterVaro!谢谢你的建议。谢谢!它与fgets()配合得很好。我也更改了最大字符串大小。(我只是不明白,为什么它的大小是0或1。)它是出于巧合…你正在向未分配的内存写入。只要(出于巧合)你没有在某个地方写入正在崩溃的内容(之前分配的内存的剩余部分没有被任何程序使用,也没有受到保护),它应该