在熟悉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);
}
答案 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;如果指针ch
是null
- 值&#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)输出函数(fgets
,scanf
等)紧跟输出函数。
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
。