Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中字符串输入的处理_C_Arrays - Fatal编程技术网

C语言中字符串输入的处理

C语言中字符串输入的处理,c,arrays,C,Arrays,我正在尝试将字符串输入到固定大小的字符数组中。 我有一个问题: 当我输入一个比char数组大的字符串时,数组会变得更大,而不需要任何额外的声明。我想让代码只接受“等于或小于char数组”的字符串 多谢各位 代码: #包括 #包括 #包括 #包括 /***************************作用****************************/ int字符串长度(字符s[]){ int c=0; 而(s[c]!='\0') C++; 返回c; } /**************

我正在尝试将字符串输入到固定大小的字符数组中。 我有一个问题:

  • 当我输入一个比char数组大的字符串时,数组会变得更大,而不需要任何额外的声明。我想让代码只接受“等于或小于char数组”的字符串 多谢各位

    代码:

    #包括
    #包括
    #包括
    #包括
    /***************************作用****************************/
    int字符串长度(字符s[]){
    int c=0;
    而(s[c]!='\0')
    C++;
    返回c;
    }
    /**************************************************************/
    char*str;
    内角大小;
    void opt1()
    {
    printf(“输入数组大小:”);
    scanf(“%d”、&arrSize);
    arrSize=arrSize+1;
    str=malloc(arrSize);
    返回;
    }
    void opt2()
    {
    printf(“输入字符:”);
    scanf(“%s”,str);
    长度=字符串长度(str);
    printf(“您的输入是“%s”\n”,str);
    printf(“您的输入长度为“%d”\n”,长度);
    返回;
    }
    int main()
    {
    int输入=0;
    while(输入!=3){
    printf(“\n名称\n”);
    printf(“\n”);
    printf(“------------------------------------------------\n”);
    printf(“1)制作数组\n”);
    printf(“2)检查数组\n”);
    printf(“3)退出\n”);
    printf(“\n输入选择:”);
    scanf(“%d”,输入(&I));
    如果(输入=1){
    /* */
    opt1();
    }
    else if(输入=2){
    opt2();
    }
    }
    返回1;
    }
    
    要阅读整行内容,可以使用
    fgets

    char line[80];
    
    if (fgets(line, sizeof line, stdin) != NULL) {
        // use the input
    }
    

    现在,您不需要检查用户输入的字符是否超过限制,因为
    fgets
    将只获得前79个(-1为空终止符)字符;其余部分(如果有的话)将被忽略。

    要整行阅读,可以使用
    fgets

    char line[80];
    
    if (fgets(line, sizeof line, stdin) != NULL) {
        // use the input
    }
    

    现在,您不需要检查用户输入的字符是否超过限制,因为
    fgets
    将只获得前79个(-1为空终止符)字符;其余部分(如果有的话)将被忽略。

    要整行阅读,可以使用
    fgets

    char line[80];
    
    if (fgets(line, sizeof line, stdin) != NULL) {
        // use the input
    }
    

    现在,您不需要检查用户输入的字符是否超过限制,因为
    fgets
    将只获得前79个(-1为空终止符)字符;其余部分(如果有的话)将被忽略。

    要整行阅读,可以使用
    fgets

    char line[80];
    
    if (fgets(line, sizeof line, stdin) != NULL) {
        // use the input
    }
    

    现在,您不需要检查用户输入的字符是否超过限制,因为
    fgets
    将只获得前79个(-1为空终止符)字符;其余部分(如果有)将被忽略。

    OP希望读取数据,但如果大于目标阵列,则不要更改目标阵列

    // 1: success
    // -1 EOF
    // 0: Input too long
    int read_array(char *buffer, size_t size) {
      char tmp[size];
      size_t i = 0;
      int ch;
    
      while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
        if (i < size) { 
          tmp[i++] = ch;
        }
      }
    
      if (ch == EOF && i == 0) return EOF;
      if (i >= size) return 0;  // too many
      memcpy(buffer, tmp, i);
      buffer[i] = '\0';
      return 1;
    }     
    
    //1:成功
    //-1 EOF
    //0:输入太长
    整数读取数组(字符*缓冲区,大小){
    字符tmp[大小];
    尺寸i=0;
    int-ch;
    while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
    如果(i=size)返回0;//太多
    memcpy(缓冲区、tmp、i);
    缓冲区[i]='\0';
    返回1;
    }     
    

    通常情况下,代码可以使用
    fgets()
    ,但也存在无法达到OP目标的极端情况。

    OP希望读取数据,但如果大于目标数组,则不要更改目标数组

    // 1: success
    // -1 EOF
    // 0: Input too long
    int read_array(char *buffer, size_t size) {
      char tmp[size];
      size_t i = 0;
      int ch;
    
      while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
        if (i < size) { 
          tmp[i++] = ch;
        }
      }
    
      if (ch == EOF && i == 0) return EOF;
      if (i >= size) return 0;  // too many
      memcpy(buffer, tmp, i);
      buffer[i] = '\0';
      return 1;
    }     
    
    //1:成功
    //-1 EOF
    //0:输入太长
    整数读取数组(字符*缓冲区,大小){
    字符tmp[大小];
    尺寸i=0;
    int-ch;
    while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
    如果(i=size)返回0;//太多
    memcpy(缓冲区、tmp、i);
    缓冲区[i]='\0';
    返回1;
    }     
    

    通常情况下,代码可以使用
    fgets()
    ,但也存在无法达到OP目标的极端情况。

    OP希望读取数据,但如果大于目标数组,则不要更改目标数组

    // 1: success
    // -1 EOF
    // 0: Input too long
    int read_array(char *buffer, size_t size) {
      char tmp[size];
      size_t i = 0;
      int ch;
    
      while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
        if (i < size) { 
          tmp[i++] = ch;
        }
      }
    
      if (ch == EOF && i == 0) return EOF;
      if (i >= size) return 0;  // too many
      memcpy(buffer, tmp, i);
      buffer[i] = '\0';
      return 1;
    }     
    
    //1:成功
    //-1 EOF
    //0:输入太长
    整数读取数组(字符*缓冲区,大小){
    字符tmp[大小];
    尺寸i=0;
    int-ch;
    while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
    如果(i=size)返回0;//太多
    memcpy(缓冲区、tmp、i);
    缓冲区[i]='\0';
    返回1;
    }     
    

    通常情况下,代码可以使用
    fgets()
    ,但也存在无法达到OP目标的极端情况。

    OP希望读取数据,但如果大于目标数组,则不要更改目标数组

    // 1: success
    // -1 EOF
    // 0: Input too long
    int read_array(char *buffer, size_t size) {
      char tmp[size];
      size_t i = 0;
      int ch;
    
      while ((ch = fgetc(stdin)) != EOF && ch != '\n') {
        if (i < size) { 
          tmp[i++] = ch;
        }
      }
    
      if (ch == EOF && i == 0) return EOF;
      if (i >= size) return 0;  // too many
      memcpy(buffer, tmp, i);
      buffer[i] = '\0';
      return 1;
    }     
    
    //1:成功
    //-1 EOF
    //0:输入太长
    整数读取数组(字符*缓冲区,大小){
    字符tmp[大小];
    尺寸i=0;
    int-ch;
    while((ch=fgetc(stdin))!=EOF&&ch!='\n'){
    如果(i=size)返回0;//太多
    memcpy(缓冲区、tmp、i);
    缓冲区[i]='\0';
    返回1;
    }     
    

    通常情况下,代码可以使用
    fgets()
    ,但也存在无法达到OP目标的极端情况。

    1)
    scanf(“%s\n”,&str)-->
    scanf(“%s”,str)str的类型是
    char*
    。(请参见
    char*str;
    )。您的实际代码
    charstr,而不是
    char*str。请看,我放置的字符数比数组大小还多,这也需要它。这是未定义的行为。可能会发生意外的内存破坏。如果出现故障,则可能不会立即发现,即使已立即发现故障原因。请使用
    realloc
    。通过
    malloc
    保护的内存块可以通过
    realloc
    .1)
    scanf(“%s\n”和&str)扩展-->
    scanf(“%s”,str)str的类型是
    char*
    。(请参见
    char*str;
    )。您的实际代码
    charstr,而不是
    char*str。请看,我放置的字符数比数组大小还多,这也需要它。这是未定义的行为。可能会发生意外的内存破坏。它可能不会被发现