#include <stdio.h>
char converter(char input[]);
char getInformation (char input[]);
int main(){
char c[99];
int i;
printf("Enter a Line:");
scanf("%c", &c);
while(i < 99){
printf("%c\n", &c[i]);
i++;
}
}
我尝试运行此
时的结果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:
我试图让它读取文本并将其打印出来。有没有办法可以将数组设置为未定义的数字,我将如何将其实现到while循环中?我也可以对如何检查每个角色并改变它的情况有一些指导(从小写到大写,反之亦然)。我想我可以通过检查字符的ASCII值并翻转数字来做到这一点。例如,如果字符是65-90的十进制值,即A-Z,我会向它添加32以使其变小。对于97-122,a-z中的角色,我会减去32.我不需要答案,但有些命中会很好。谢谢。
到目前为止,我已做出这些改变。
#include <stdio.h>
char converter(char input[]);
char getInformation (char input[]);
int main(){
char c[30];
int i;
printf("Enter a Line: ");
fgets(c, sizeof(c), stdin);
i=0;
while( i < sizeof(c)){
printf("%s", c[i]);
i++;
}
}
这是我在尝试运行之后得到的结果。
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:
是的我明白了!非常感谢大家!这是代码
#include <stdio.h>
int main(){
char c[BUFSIZ];
int i;
printf("Enter a Line: ");
fgets(c, BUFSIZ, stdin);
i=0;
for (i=0; i < sizeof(c); i++){
if ((c[i] >= 65) && (c[i] <= 90) ){
c[i] = c[i]+32;
}else {
if ((c[i] >=97) && (c[i] <= 122) ){
c[i] = c[i]-32;
}
}
}
以及我运行时的结果:
z:~/homework1: gcc -o hw1_1 hw1_1.c
z:~/homework1: hw1_1
Enter a Line: TeoijsTY;' ';lasd
tEOIJSty;' ';LASD
z:~/homework1:
这是你可以拥有的最好的感觉,编写一个有效的代码!我想知道我是否发布这个帖子,我的教授会对我的代码进行谷歌检查,并认为我是抄袭的?无论如何,非常感谢你的帮助。
答案 0 :(得分:2)
scanf
并不适合阅读整行。使用fgets
。
char c[99];
fgets(c, 99, stdin);
答案 1 :(得分:0)
当您通过scanf
阅读某行时,使用char
的格式说明符,您应该使用%s
或最好使用%98s
来避免溢出。另一方面,当逐个打印字符时,您应该将字符本身作为参数传递给printf
而不是其地址,因此它应该是printf("%c\n",c[i]);
。
为避免打印出比读入的字符多的字符,您可以先填充char
- 数组,然后使用小于数组大小的宽度进行扫描,以保证您有一个以0结尾的字符串在数组和打印循环中,检查c[i] != 0
。
对于大小写转换,标题<ctype.h>
包含必要的函数,这比自己编写代码要好。如果您不允许使用它们,那么与'A' = 65
等进行比较的计划适用于ASCII字符,但您可能还需要考虑128-255范围内的字符(取决于您的分配)。
答案 2 :(得分:0)
scanf("%c", &c);
将扫描一个字符。到c[0]
。它不会扫描成一行。
然后你的循环将在随机位置打印99个字符,因为你没有将i
初始化为0.即使你有,你也会打印出所有99个字符,其中大部分是未初始化的。
这就是为什么你没有得到一条线,为什么你在输出中看到垃圾。
对于基于行的输入,您需要查看fgets
,它可以安全地从用户输入一行(它可以防止内置缓冲区溢出)。然后,一旦你有了这条线,你可以使用printf ("%s\n", c)
或puts(c)
输出它 - 不需要一次处理一个字符。
如果您正在寻找使用fgets
的好方法,请参阅here。完整功能可能不适合此级别的家庭作业,但您可以查看代码以了解其工作原理。你不应该逐字复制它,除非你想被指控抄袭,但是,无论如何,用它来教育自己。
底线:
fgets (buff, size, handle);
会将文件句柄handle
中的字符(使用stdin
用于用户输入)读取到buff
的内存中,大小限制为size
。
上面链接的getLine
函数将处理边缘情况,例如文件结束检测,用户为缓冲区输入太长的行等等。
下面的功能重复完整性:
#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;
}