C编程 - 指针问题,没有控制台输出

时间:2017-01-17 17:00:01

标签: c eclipse pointers mingw

在熟悉Java之后,我现在正试图扩展自己的视野并尝试C编程。但是,即使访问过多个视频和网站,我也似乎无法围绕C中的指针。

下面的代码应该从用户获取两个字符串,获取它们的长度,然后将长度相互比较。然后程序应该返回两个名称中最长的一个(通过指针非常小心地返回长度,直到换行符,而不是变量的分配大小)。因此,当用户输入'Peterson'(name1)和'Thisisareallylonglastname'(name2)时,程序应该通过pointer / name2连接返回'Thisisareallylonglastname'。

我遇到的问题是,在尝试运行代码时(使用MinGW编译器在Eclipse Neon C / C ++ IDE中编写),我在控制台中没有输出。我相当肯定我已经在Windows中正确设置了我的MinGW安装路径,但是为了确保我还手动将环境添加到项目中。在我的指针混乱和一般是一个糟糕的编码器之间,我不确定我的程序(无疑是新手)错误是什么。我没有在Neon IDE中收到任何错误。

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

int main(void)
{

    /* Two variables that take family names' input from the user with a maximum length of 256 */
    char name1[256];
    char name2[256];
    char *ch = NULL;

    printf("When two people marry there can sometimes be a debate which last/family name will henceforth be used (as a hyphenated last name is not always feasible.");
    printf("A simple way to avoid squabbles is to simply take the longest family name of the two (soon-to-be) partners.");
    printf("This program will take your name inputs and compare their length against one another; it will then return the longest name to be put on the document.");

    printf("Enter your last name for 1 :");
    gets(name1);
    printf("Enter your last name for 2 :");
    gets(name2);

    int size1 = strlen(name1);
    printf("Length of name 1:");
    printf(size1);

    int size2 = strlen(name2);
    printf("Length of name 2:");
    printf(size2);

    if (size1 > size2)
    {
        ch = &name1;
    }
    else
    {
        ch = &name2;
    }

    if(!ch)
    {
        printf("The largest family name found is:");
        printf(*ch);
    }

    return(0);

}

4 个答案:

答案 0 :(得分:0)

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

int main(void)
{

    /* Two variables that take family names' input from the user with a maximum length of 256 */
    char name1[256];
    char name2[256];
    char *ch = NULL;

    printf("When two people marry there can sometimes be a debate which last/family name will henceforth be used (as a hyphenated last name is not always feasible.");
    printf("A simple way to avoid squabbles is to simply take the longest family name of the two (soon-to-be) partners.");
    printf("This program will take your name inputs and compare their length against one another; it will then return the longest name to be put on the document.");

    printf("Enter your last name for 1 :");
    gets(name1);
    printf("Enter your last name for 2 :");
    gets(name2);

    int size1 = strlen(name1);
    printf("Length of name 1: %d", size1);


    int size2 = strlen(name2);
    printf("Length of name 2: %d", size2);

    if (size1 > size2)
    {
        ch = name1;
    }
    else
    {
        ch = name2;
    }


    printf("The largest family name found is: %s", ch);



    return(0);

}

这应该可以解决问题。您还应该使用scanf("%s", str)而不是获取。

执行char name1[256]时,name1是&#34;被视为指针&#34;,所以你必须ch = name1而不是ch = &name1,因为ch和name1都是指针。

当你这样做时:

if(!ch)
{
  printf...
}

如果ch为空,你只会打印,你不想要,因为在这种情况下,如果ch有一个值你想要打印,那么你应该这样做:

if(ch)
{
  printf...
}

同样在c printf中必须收到有关您要打印的变量的信息,请查看printf示例以了解它

答案 1 :(得分:0)

一个主要问题是你的最终输出是在if (!ch)条件下 - 用英语读取&#34;如果指针chnull - 值&#34; 。由于它指向两个(非null)内存位置中的一个,因此该检查将永远不会通过。

如果您将其更改为if (ch)(或者只是省略检查,因为我们知道它不是null)并修复其他人指出的printf问题评论,我认为你会得到更好的结果。

答案 2 :(得分:0)

指向char和char数组的指针都是在C中表示字符串的方式,因此它们是相同的类型。主要的区别在于,对于数组,内存是在编译时分配的,并且使用指针为它分配一个数组(就像你正在尝试做的那样)或动态分配内存。

所以当你做

ch = &name1;

你实际做的是尝试将指向字符串name1的指针分配给ch,这不是同一类型,应该抛出错误。相反,你真的想要做

ch = name1;

相反,* ch与ch [0]相同 - 您正在访问字符串的第一个字符,以便将其打印出来

printf("%s",ch);

答案 3 :(得分:0)

问题是,您希望printf充当像System.out.println这样的多态函数,而且它不会。 printf的原型是

int printf( const char * restrict format, ... );

第一个参数是总是一个字符串;该字符串可能包含转换说明符,用于控制如何格式化任何其他参数。

所以不要写:

printf("Length of name 1:");
printf(size1);

你写的:

printf( "Length of name 1: %d\n", size1 );

printf( "Length of name 1: " );
printf( "%d\n", size1 );

格式字符串中的%d告诉printf相应的参数应该具有类型int,并且您希望将其值显示为十进制数字字符串。有关转换说明符的完整列表,请参阅online C 2011 standard,第7.21.6.1节。

printf不会按照System.out.println的方式自动为所有输出添加换行符 - 您必须以格式字符串(\n)指定它。

标准输出通常是行缓冲 - 输出不会显示在控制台上,直到a)缓冲区已满,b)缓冲区是用fflush手动刷新的, c)缓冲区中出现换行符,或d)输出函数(fgetsscanf等)紧跟输出函数。

C和Java中的数组语义非常不同。在C中,数组不是引用对象 - 它们不指向堆上动态分配的内存。但是,数组下标操作a[i]是根据指针算法 - *(a + i)定义的。 C中发生的情况是,当数组表达式不是sizeof或一元&运算符的操作数时,或者不是用于初始化数组的字符串文字在一个声明中,表达式被转换(&#34;衰变&#34;)来自类型&#34; N元素数组T&#34; to&#34;指向T&#34;的指针,表达式的值是数组第一个元素的地址。

这是一种非常冗长的说法,而不是写作

 ch = &name1;

应该写作

 ch = name1;

代替。 表达式 name1&#34;衰变&#34;指向数组的第一个元素的指针,表达式的结果类型为char *。表达式&name1的类型是char (*)[256](指向char的256个元素数组的指针),这不是您想要的。他们都会评估到相同的位置(模数任何类型的转换),但键入很重要。

...最后

绝不永远不会使用gets在您的代码中引入故障点/主要安全漏洞。它在C99标准发布后不久就被弃用,并且已经正式从C2011的标准库中删除。几十年来,一个图书馆职能部门负责无数的混乱。不要使用它,即使在玩具代码中也不要使用它。它是&#34; Highlander II&#34; C编程语言 - 它从未存在。请改用fgets