- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的目标是写一个程序,从一个输入语句中读取最多100个字符,然后从存储的数据中输出3个字符。该输入语句的反向,数组的奇数元素和数组的偶数元素。因此,我有3个printf函数。我有2个单独的代码来执行此操作,并且无法弄清楚如何将两者结合起来。
#include <stdio.h>
int main(void){
int i, j;
char str[100];
printf("Enter String\n");
fgets(str, sizeof str, stdin);
printf("\nString in Reverse Order\n");
i = 0;
while(str[i] != '\0')
{
if(str[i] == ' ' || str[i] == '\n')
{
for(j = i - 1; j >= 0 && str[j] != ' '; j--)
printf("%c", str[j]);
printf(" ");
}
i++;
}
printf("\n");
return 0;
}
#include <stdio.h>
#include <string.h>
int main() {
char string[100], even[100], odd[100], i, j, k;
i = j = k = 0;
printf("Enter your input string:");
fgets(string, 100, stdin);
string[strlen(string) - 1] = '\0';
while (string[i] != '\0') {
if (i % 2 == 0) {
odd[j++] = string[i];
} else {
even[k++] = string[i];
}
i++;
}
odd[j] = even[k] = '\0';
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
return 0;
}
#include <stdio.h>
#include <string.h>
int main() {
int m;
char string[100], even[100], odd[100], i, j, k;
i = j = k = 0;
//get the input string from the user
printf("Enter your input string:");
fgets(string, 100, stdin);
printf("\nString in Reverse Order\n");
string[strlen(string) - 1] = '\0';
while(string[i] != '\0'){
if(string[i] == ' ' || string[i] == '\n' || i % 2 == 0)
{
for(m = i - 1; m >= 0 && string[m] != ' '; m--)
printf("%c", string[m]);
printf(" ");
odd[j++] = string[i];
}
else {
even[k++] = string[i];
}
i++;
}
//terminating even and odd string with NULL
odd[j] = even[k] = '\0';
printf("\n");
//print the charactersa at odd position and even positions
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
return 0;
}
最佳答案
作为suggested,将comment转换为答案,并将其扩展(答案中没有600个字符的限制)。
您具有读取一行并切掉换行符的代码;将其打包为函数1.将数组和数组大小从主程序传递到函数中;返回读取的字符串的长度。
您有代码可以反向打印字符串。这样可以更简单,因为您不再需要担心换行符,因为功能1已将其删除。将其打包为功能2。
您有代码来查找和打印字符串的奇数元素和偶数元素;将其打包为函数3。同样,您可以将数组和字符串长度传递给函数,这使得编写起来更加容易。
然后,您的主程序声明变量并调用函数。您应该为我指定的函数使用更有意义的名称-但是在下面的代码中,当我使用函数时,我坚持使用数字名称,以便可以清楚地看到对应的名称。
这或多或少是使用任何代码的方式。您编写了可完成可识别任务的函数,然后安排其他代码以适当的顺序调用这些函数。您将学习如何将参数传递给函数并从函数返回合适的值,并使用它们来指导代码。在某种程度上,您已经熟悉使用函数执行任务的过程。例如,您使用fgets()
和strlen()
:它们各自都有不同的工作要做,但是代码是可重用的,因此由标准C库提供。您的代码将不太可重用,因此不太可能成为标准C库的一部分,但是有时您会编写可重复使用的代码,以使其进入您自己的个人库。
看一下函数3。它完成两项工作:也许应该将其分为两个独立的函数,一个用于奇数元素,另一个用于偶数元素。或者,也许有一个隐藏在其中的通用函数:从第M个元素开始打印字符串的每个第N个元素。也许函数应该简单地将N / M元素复制到新数组中(传递给函数),然后协调函数应调用提取代码,然后打印代码。通常将I / O与算法的其余部分分开。混合使用这两种功能的函数通常不太可重用。 (功能2也可能受益于算法和I / O的分离。通用字符串反向器可能会有用。)
还要注意,没有一个正确的结果。在很大程度上取决于上下文。但是考虑到示例代码,我认为三个功能加上main可能是相互竞争的利益之间的适当平衡。但是重要的是不要害怕创建和使用函数。
出于所有应有的考虑,您提出的解决方案会混淆处理过程,并使代码不必要地变得复杂。这就是我所说的三个功能:combo1.c
#include <stdio.h>
#include <string.h>
static int function_1(char *buffer, size_t buflen)
{
printf("Enter your input string: ");
if (fgets(buffer, buflen, stdin) == 0)
return 0;
int len = strlen(buffer);
if (len > 0)
buffer[--len] = '\0';
return len;
}
static void function_2(char *string, int len)
{
printf("String in Reverse Order: ");
for (int i = len; i >= 0; i--)
putchar(string[i]);
putchar('\n');
}
static void function_3(char *string, int len)
{
char even[100];
char odd[100];
int j = 0;
int k = 0;
for (int i = 0; i < len; i++)
{
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
odd[j] = even[k] = '\0';
// print the characters at odd position and even positions
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
}
int main(void)
{
char string[100];
int len;
while ((len = function_1(string, sizeof(string))) != 0)
{
function_2(string, len);
function_3(string, len);
}
putchar('\n');
return 0;
}
$ ./combo1
Enter your input string: Hello World!
String in Reverse Order: !dlroW olleH
Characters at odd position: el ol!
Characters at even position: HloWrd
Enter your input string: AManAPlanACanalPanama
String in Reverse Order: amanaPlanaCAnalPAnaMA
Characters at odd position: MnPaAaaPnm
Characters at even position: AaAlnCnlaaa
Enter your input string: ^D
$
^D
出现在我键入Control-D来指示输入结束的位置的原因。最后的
putchar('\n');
用于将提示放在下一行。
combo2.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[100];
printf("Enter your input string: ");
if (fgets(string, sizeof(string), stdin) == 0)
{
putchar('\n');
return 0;
}
int len = strlen(string);
if (len > 0)
{
string[--len] = '\0';
printf("String in Reverse Order: ");
for (int i = len; i >= 0; i--)
putchar(string[i]);
putchar('\n');
char even[100];
char odd[100];
int j = 0;
int k = 0;
for (int i = 0; i < len; i++)
{
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
odd[j] = even[k] = '\0';
// print the characters at odd position and even positions
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
}
return 0;
}
$ ./combo2
Enter your input string: AManAPlanACanalPanama
String in Reverse Order: amanaPlanaCAnalPAnaMA
Characters at odd position: MnPaAaaPnm
Characters at even position: AaAlnCnlaaa
$
combo3.c
#include <stdio.h>
#include <string.h>
int main(void)
{
char string[100];
printf("Enter your input string: ");
if (fgets(string, sizeof(string), stdin) == 0)
{
putchar('\n');
return 0;
}
int len = strlen(string);
if (len > 0)
{
string[--len] = '\0';
char even[100];
char odd[100];
int j = 0;
int k = 0;
printf("String in Reverse Order: ");
for (int i = 0; i < len; i++)
{
putchar(string[len - i]);
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
putchar('\n');
odd[j] = even[k] = '\0';
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
}
return 0;
}
$ ./combo3
Enter your input string: A Man, A Plan, A Canal, Panama!
String in Reverse Order: !amanaP ,lanaC A ,nalP A ,naM
Characters at odd position: a,APa,ACnl aaa
Characters at even position: AMn ln aa,Pnm!
$
combo4.c
main()
程序中的输出然后重用函数来提供更好的职责分离。请注意,我可以使用
print_reversed_string()
三次,对于两次使用,该字符串甚至不在行尾。
#include <stdio.h>
#include <string.h>
static int read_line(const char *prompt, char *buffer, size_t buflen)
{
printf("%s: ", prompt);
fflush(stdout);
if (fgets(buffer, buflen, stdin) == 0)
return 0;
int len = strlen(buffer);
if (len > 0)
buffer[--len] = '\0';
return len;
}
static void print_reversed_string(char *string, int len)
{
for (int i = len; i >= 0; i--)
putchar(string[i]);
}
static void extract_odd_even(char *string, int len, char *odd, char *even)
{
int j = 0;
int k = 0;
for (int i = 0; i < len; i++)
{
if (i % 2 == 0)
even[k++] = string[i];
else
odd[j++] = string[i];
}
odd[j] = even[k] = '\0';
}
int main(void)
{
char string[100];
char even[100];
char odd[100];
int len;
while ((len = read_line("Enter your input string", string, sizeof(string))) != 0)
{
printf("String in Reverse Order: ");
print_reversed_string(string, len);
putchar('\n');
extract_odd_even(string, len, odd, even);
printf("Characters at odd position: %s\n", odd);
printf("Characters at even position: %s\n", even);
printf("Reversed even characters: [");
print_reversed_string(odd, strlen(odd));
printf("]\n");
printf("Reversed odd characters: [");
print_reversed_string(odd, strlen(odd));
printf("]\n");
}
putchar('\n');
return 0;
}
$ ./combo4
Enter your input string: A Man, A Plan, A Canal, Panama!
String in Reverse Order: !amanaP ,lanaC A ,nalP A ,naM A
Characters at odd position: a,APa,ACnl aaa
Characters at even position: AMn ln aa,Pnm!
Reversed even characters: [aaa lnCA,aPA,a ]
Reversed odd characters: [aaa lnCA,aPA,a ]
Enter your input string: Gratuitous Display of Lunacy
String in Reverse Order: ycanuL fo yalpsiD suotiutarG
Characters at odd position: rtiosDslyo uay
Characters at even position: Gautu ipa fLnc
Reversed even characters: [yau oylsDsoitr]
Reversed odd characters: [yau oylsDsoitr]
Enter your input string: ^D
$
reverse_string()
分隔为无法打印的功能:
static void reverse_string(const char *i_buff, int i_len, char *o_buff)
{
for (i = 0; i < i_len; i++)
o_buff[i] = i_buff[i_len - i];
o_buff[len] = '\0';
}
static char *reverse_string(const char *i_buff, int i_len, char *o_buff)
{
for (i = 0; i < i_len; i++)
o_buff[i] = i_buff[i_len - i];
o_buff[len] = '\0';
return o_buff;
}
printf()
的调用中:
char rev[100];
printf("Reversed odd characters: [%s]\n", reverse_string(odd, strlen(odd), rev));
关于c - 需要帮助结合两个C代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35532670/
我有一张 Excel 表格,用于更新玩家评分。 播放器 配售 初始化 1 2 3 4 金融评级 一个 1 2.0 1.000 0.018 0.016 0.014 2.007 D 2 -2.0 54.5
我有一个 map = std::map ,其中 myItemModel继承QAbstractItemModel . 我现在要合并所有 myItemModel合一myItemModel (其他所有元素模
我大量使用“do.call”来生成函数调用。例如: myfun <- "rnorm"; myargs <- list(n=10, mean=5); do.call(myfun, myargs); 但是
想象一下 InputStream 的以下变体: trait FutureInputStream { //read bytes asynchronously. Empty array means E
这是我的 C 代码: #include void sum(); int newAlphabet; int main(void) { sum();
我只是想选择类“.last”之后的每个元素。 HTML: 1 2 Jquery
我正在为一个项目构建一个 XML 反序列化器,我经常遇到这种类型的代码情况: var myVariable = ParseNDecimal(xml.Element("myElement")) == n
这是来自 Selecting the highest salary 的继续问题 假设有一个表 'wagetable' name lowhours highhours wage pri
我正在为我的程序创建一个战舰程序;该程序运行良好,但我试图确保当用户将坐标超出范围时,程序会说他们输入的坐标不正确。这是代码: #include #include void
我有一个函数,它为每种情况返回不同的 DWORD 值,如果出现错误。所以我有以下定义: #define ERR_NO_DB_CONNECTION 0x90000 #define ERR_DB_N
在派生类中引发基类事件以下简单示例演示了在基类中声明可从派生类引发的事件的标准方法。此模式广泛应用于 .NET Framework 类库中的 Windows 窗体类。在创建可用作其他类的基类的类时,应
我只是想知道这是否可能: use Modern::Perl; my @list = ('a' .. 'j'); map { func($_) } each(@list); sub func { m
我一直在使用 =IF(L2="","Active",IF(K2I2,"Late"))) 有效,但现在我需要检查 F 上的多个条件 专栏 我试过了 OR 函数 =IF(OR(F2="Scheduled"
我有 2 个命令,如下所示。 在视频中添加介绍图片 ffmpeg -y -loop 1 -framerate 10 -t 3 -i intro.png -i video.mp4 -filter_com
好的,我有这个公式可以根据名字和姓氏列表生成用户名。现在,虽然这可行,但我希望单元格改为引用我自己的 VBA 函数。但是,由于代码少得多,我仍然想使用原始公式。 我有这个公式: =SUBSTITUTE
我有两个 HAProxy 实例。两个实例都启用了统计信息并且工作正常。 我正在尝试将两个实例的统计信息合并为一个,以便我可以使用单个 HAProxy 来查看前端/后端统计信息。我试图让两个 hapro
我有一个 Observable,其中每个新值都应该引起一个 HTTP 请求。在客户端,我只关心最新的响应值;但是,我希望每个请求都能完成以进行监控/等。目的。 我目前拥有的是这样的: function
我的网站上有 TinyMCE 插件。在 TinyMCE 插件的 textarea 中添加图像时,我希望这些图像包含延迟加载。我网站的缩略图具有特定类型的延迟加载,其中 src 图像是灰色背景。根据用户
我希望合并润滑间隔,以便如果它们重叠,则从内部第一个时间获取最小值和从内部最后一个时间获取最大值并总结以创建一个跨越整个时间段的新间隔。这是一个reprex: library(lubridate, w
我有一个应用程序,它本质上是一个页眉、主要内容和一个始终可见的页脚。页脚可以改变大小,我想在页脚上方的主内容面板上放置一些工具。主要布局是用 flex 完成的,我阅读文档的理解是绝对定位通过相对于最近
我是一名优秀的程序员,十分优秀!