c函数,即;上套管;一串

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"

这是我的目标:

输入:混合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);
}
#包括
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')&(*sptr
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){
如果((*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。)它是出于巧合…你正在向未分配的内存写入。只要(出于巧合)你没有在某个地方写入正在崩溃的内容(之前分配的内存的剩余部分没有被任何程序使用,也没有受到保护),它应该