C 我能';t将其编码为复制字符串

C 我能';t将其编码为复制字符串,c,C,我试着让它读一段文字并打印出来。是否有一种方法可以将数组设置为未定义的数字,以及如何将其实现到while循环中?另外,我可以有一些指导,如何检查每个字符,并改变它的大小写(从小写到大写,反之亦然)。我想我可以通过检查字符的ASCII值并翻转数字来实现这一点。例如,如果字符是65-90之间的十进制值,即a-Z,我会将其加上32以使其变小。对于97-122中的字符,a-z,我将减去32。我不需要答案,但是点击一下就好了。多谢各位 到目前为止,我已经做了这些改变 z:~/homework1: gcc

我试着让它读一段文字并打印出来。是否有一种方法可以将数组设置为未定义的数字,以及如何将其实现到while循环中?另外,我可以有一些指导,如何检查每个字符,并改变它的大小写(从小写到大写,反之亦然)。我想我可以通过检查字符的ASCII值并翻转数字来实现这一点。例如,如果字符是65-90之间的十进制值,即a-Z,我会将其加上32以使其变小。对于97-122中的字符,a-z,我将减去32。我不需要答案,但是点击一下就好了。多谢各位

到目前为止,我已经做了这些改变

z:~/homework1: gcc -o hw1_1 hw1_1.c
z:~/homework1: hw1_1
Enter a Line:Test
Ø
Ù
Ú
Û
Ü
Ý
Þ
ß
à
á
â
ã
ä
å
æ
ç
è
é
ê
ë
ì
í
î
ï
ð
ñ
ò
ó
ô
õ
ö
÷
ø
ù
ú
û
ü
ý
þ
ÿ





































1
2
3
4
5
6
7
8
9
:
z:~/homework1:
是的,我明白了!谢谢大家!!这是密码

z:~/homework1: gcc -o hw1_1 hw1_1.c
z:~/homework1: hw1_1
Enter a Line: Test
Segmentation fault (core dumped)
z:~/homework1: z:~/homework1:

这是最好的感觉,你可以有,写一个工作代码!我想知道我是否发布了这篇文章,我的教授在谷歌上检查了我的代码,认为我剽窃了?无论如何,非常感谢您的帮助。

当您通过
scanf
阅读一行时,您使用
字符的格式说明符,您应该使用
%s
或者最好使用
%98s
来避免溢出。另一方面,在逐个打印字符时,应该将字符本身作为参数传递给
printf
,而不是它的地址,因此它应该位于
printf(“%c\n”,c[i])

为避免打印出的字符数超过读入的字符数,您可以先将
char
-数组归零,然后以小于数组大小的宽度进行扫描,以确保数组中有一个以0结尾的字符串,并在打印循环中检查
c[i]!=0


对于大小写转换,标题
包含必要的函数,这比自己编写好。如果你不允许使用它们,你的计划与<代码>‘a’=65 < /代码>等比较适合ASCII字符,但是你也可能需要考虑128255范围内的字符(取决于你的赋值)。

<代码> SCANF不适合阅读整行。使用
fgets

z:~/homework1: gcc -o hw1_1 hw1_1.c
z:~/homework1: hw1_1
Enter a Line: TeoijsTY;' ';lasd
tEOIJSty;' ';LASD

z:~/homework1:
scanf(“%c”和&c)将扫描单个字符。到
c[0]
。它不会一行扫描

然后循环将在随机位置打印99个字符,因为您尚未将
i
初始化为0。即使您有,您也会打印出所有99个字符,其中大部分是未初始化的

这就是为什么你没有得到一条线,为什么你在输出中看到垃圾

对于基于行的输入,您需要查看
fgets
,它可以安全地从用户输入行(内置了防止缓冲区溢出的功能)。然后,一旦有了行,就可以使用
printf(“%s\n”,c)
put(c)
来输出它-无需一次处理一个字符

如果您正在寻找使用
fgets
的好方法,请参阅。完整的函数可能不适合这个级别的家庭作业,但是您可以查看代码来了解它是如何工作的。除非你想被指控剽窃,否则你不应该一字不差地复制它,但无论如何,要用它来教育自己

底线:

char c[99];
fgets(c, 99, stdin);
将从文件句柄
handle
(使用
stdin
进行用户输入)读取字符到
buff
处的内存中,大小受
size
限制

上面链接的
getLine
函数将处理边缘情况,如文件结束检测、用户为缓冲区输入太长的行等

为完整起见,功能复制如下:

fgets (buff, size, handle);
#包括
#包括
#定义OK 0
#定义无输入1
#定义太长2
静态int getLine(char*prmpt、char*buff、size\u t sz){
int ch,额外;
//获取具有缓冲区溢出保护的线路。
如果(prmpt!=NULL){
printf(“%s”,prmpt);
fflush(stdout);
}
如果(fgets(buff、sz、stdin)=NULL)
不返回任何输入;
//如果时间太长,就不会换行了。那样的话,我们就齐了
//结束通话,这样多余的通话就不会影响下一次通话。
如果(buff[strlen(buff)-1]!='\n'){
额外=0;
而(((ch=getchar())!='\n')&&(ch!=EOF))
额外=1;
返回(额外==1)?太长:正常;
}
//否则,删除换行符并将字符串返回给调用者。
buff[strlen(buff)-1]='\0';
返回OK;
}

i
的初始值可以是任何值。你是想初始化它吗?你真的认为把所有的文本都加粗会帮助你解决这个问题吗?对不起,我认为它更容易阅读。我现在就改。永远不要使用
get
fgets
是安全版本。感谢您的帮助。查看编辑问题底部的结果。你能再解释一下[引用]吗?“为了避免打印出的字符数超过读取的字符数,您可以先将字符数组归零,然后以小于数组大小的宽度进行扫描,以确保数组中有一个以0结尾的字符串,并在打印循环中检查c[i]!=0。”实际上,零填充是不必要的,因为
scanf
会自动添加带有
s
转换说明符的0-终止符,但我使用
scanf
,因此我很少阅读手册页来确定。无论如何,关键是输入的行后面跟着一个
0
'\0'
,如果您愿意)字符。您可以使用该值作为哨兵,以了解何时到达终点,而不是
i<99
您可以检查
c[i]!=0
或者,为了安抚偏执狂,这两种情况都存在。我做了更改(请参见编辑后的问题)。我试图用一种不限制我可以使用的字符数的方法。但是出现了另一个错误。当您
printf(“%s”,c[i])
字符
c[i]
首先被提升为
int
,然后
int
被传递到
printf
。由于格式说明符<
z:~/homework1: gcc -o hw1_1 hw1_1.c
z:~/homework1: hw1_1
Enter a Line: TeoijsTY;' ';lasd
tEOIJSty;' ';LASD

z:~/homework1:
char c[99];
fgets(c, 99, stdin);
fgets (buff, size, handle);
#include <stdio.h>
#include <string.h>

#define OK       0
#define NO_INPUT 1
#define TOO_LONG 2
static int getLine (char *prmpt, char *buff, size_t sz) {
    int ch, extra;

    // Get line with buffer overrun protection.
    if (prmpt != NULL) {
        printf ("%s", prmpt);
        fflush (stdout);
    }
    if (fgets (buff, sz, stdin) == NULL)
        return NO_INPUT;

    // If it was too long, there'll be no newline. In that case, we flush
    // to end of line so that excess doesn't affect the next call.
    if (buff[strlen(buff)-1] != '\n') {
        extra = 0;
        while (((ch = getchar()) != '\n') && (ch != EOF))
            extra = 1;
        return (extra == 1) ? TOO_LONG : OK;
    }

    // Otherwise remove newline and give string back to caller.
    buff[strlen(buff)-1] = '\0';
    return OK;
}