我不能编码它来复制字符串

时间:2012-01-31 00:48:27

标签: c

#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:

这是你可以拥有的最好的感觉,编写一个有效的代码!我想知道我是否发布这个帖子,我的教授会对我的代码进行谷歌检查,并认为我是抄袭的?无论如何,非常感谢你的帮助。

3 个答案:

答案 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;
}