0

嘿,这段代码正在运行。该代码是关于获取名称输入并对其进行一些更改。

#include <stdio.h>
#include <stdlib.h>

/*
 *  An example of how to use strtol() to read a number
 *  and validate that one was entered correctly.
 *
 */

int main(void)
{
  char buf[BUFSIZ];
  char *p;
  long int i;

  printf ("Enter a number: ");

  if (fgets(buf, sizeof(buf), stdin) != NULL)
  {
    i = strtol(buf, &p, 10);

    /*
     *  If the first character of the buffer is \n, the user
     *  pressed [Enter] with entering any text at all, which
     *  is therefore invalid.
     *
     *  The pointer p has been updated by strtol() to point to
     *  the first invalid character after the number.
     *  If this character is \0 it means we reached the end of
     *    the array successfully, so we received a good number.
     *  If this character is \n it also means we reached the
     *    end of the input successfully.  This is a symptom of
     *    using fgets() to obtain the string, but does not
     *    represent a problem.
     *  If this character is anything else, it means there was
     *    some additional characters entered after the number.
     *    In this sample program, I have deemed this situation
     *    to be invalid, however, in your program it may be
     *    valid, depending on what you're expecting from the user.
     *
     */

    if (buf[0] != '\n' && (*p == '\n' || *p == '\0'))
      printf ("Valid number of %ld entered\n", i);
    else  printf ("Invalid number entered\n");
  }

  return(0);
}

此代码也有效!它需要一个字符串并转换为整数!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int m;
    char name[m],rename[m],c=0,j=0;
    puts("enter your name\n");
    gets(name);
    m=strlen(name);
    if(m>20){
        while(m>20){
            puts("shorter name pls\n");
            gets(name);
            m=strlen(name);
        }
    }
    while(name[c]==' '){
        c++;}
    while(c<strlen(name)){
        if(name[c]==' '&& name[c+1]==' ')
            {c++;}
        else{
            rename[j]=name[c];
            j++;
            c++;}
    }
    rename[j]='\0';
    puts(rename);
    return 0;
}

但是在同一个程序中将它们一起输入时,程序崩溃了!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int m;
    char name[m],rename[m],c=0,j=0;
    puts("enter your name\n");
    gets(name);
    m=strlen(name);
    if(m>20){
        while(m>20){
            puts("shorter name pls\n");
            gets(name);
            m=strlen(name);
        }
    }
    while(name[c]==' '){
        c++;}
    while(c<strlen(name)){
        if(name[c]==' '&& name[c+1]==' ')
            {c++;}
        else{
            rename[j]=name[c];
            j++;
            c++;}
    }
    rename[j]='\0';
    puts(rename);
      char buf[BUFSIZ];
  char *p;
  long int i;

  printf ("Enter a number: ");

  if (fgets(buf, sizeof(buf), stdin) != NULL)
  {
    i = strtol(buf, &p, 10);

    /*
     *  If the first character of the buffer is \n, the user
     *  pressed [Enter] with entering any text at all, which
     *  is therefore invalid.
     *
     *  The pointer p has been updated by strtol() to point to
     *  the first invalid character after the number.
     *  If this character is \0 it means we reached the end of
     *    the array successfully, so we received a good number.
     *  If this character is \n it also means we reached the
     *    end of the input successfully.  This is a symptom of
     *    using fgets() to obtain the string, but does not
     *    represent a problem.
     *  If this character is anything else, it means there was
     *    some additional characters entered after the number.
     *    In this sample program, I have deemed this situation
     *    to be invalid, however, in your program it may be
     *    valid, depending on what you're expecting from the user.
     *
     */

    if (buf[0] != '\n' && (*p == '\n' || *p == '\0'))
      printf ("Valid number of %ld entered\n", i);
    else  printf ("Invalid number entered\n");
  }
    return 0;
}

为什么??

4

3 回答 3

2

当然这是非常错误的:

int m;
char name[m],rename[m],c=0,j=0;

您正在声明长度为未初始化变量的数组。

于 2012-07-20T16:07:25.047 回答
1

即使在您合并两者之前,此程序中也有几处看起来不太好。

  • 第 7 行:声明一个大小未定义的数组。
  • 第 18 行:“名称”下标索引 c 是一个字符 - 限制为 0..127。int 会更好。
  • 第 24 行:c 和 j 相同。

然后,应该避免使用 gets() 函数,因为它可能会向它提供比它准备接受的更多的数据,从而使你的程序崩溃。如果 m 被初始化为零,任何长度的任何输入都可能触发崩溃。

更改第一行使其工作:

int m = 100;
char name[m],rename[m];
int c=0,j=0;

...但是如果您输入的名称比 m 长,您将再次崩溃。

如果名称长于 m 和 127 中的较小者,仅设置 m 的值会导致崩溃。假设您有 m = 200 并输入一个包含 130 个空格的名称:那么这一行

while(name[c]==' '){ c++;}

会增加 c 直到它是 126,然后是 127,然后发现 name[127] 是一个空格会再次增加 c。但是 c 是一个字符,因此 c+1 不是 128,而是 -128。当转换为内存地址以索引“名称”时,-128 指向外太空某处,程序在火焰中崩溃。

提示:当您编译程序并且还不是专家时,请将所有编译器警告保持在最高设置。当您是专家时,您将能够将它们关闭——并且将学会不想要:-)。

GCC 在您的第一个来源上运行 说:

In function ‘main’:
18:5: warning: array subscript has type ‘char’ [-Wchar-subscripts]
20:12: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
21:9: warning: array subscript has type ‘char’ [-Wchar-subscripts]
24:13: warning: array subscript has type ‘char’ [-Wchar-subscripts]
24:13: warning: array subscript has type ‘char’ [-Wchar-subscripts]
28:5: warning: array subscript has type ‘char’ [-Wchar-subscripts]
7:5: warning: ‘m’ is used uninitialized in this function [-Wuninitialized]
warning: the `gets' function is dangerous and should not be used.
于 2012-07-20T16:12:29.887 回答
0

你是什​​么意思'崩溃'?提前终止?有什么错误?程序应该做什么?

另请注意,gets() 永远不应在实际代码中使用。

于 2012-07-20T16:10:17.580 回答