- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在每第 N 个字符串之间添加字符串。
我的想法:
char *a = "one", *b = "two";
char *word = "Simple sentence containing some random words";
char result[200];
int len = strlen(word);
int spaces = 0;
for(int i = 0; i < len; i++)
{
if(word[i] == ' ')
spaces++;
result[i] = word[i];
if(spaces % 3 == 0)
{
//copy a to result
}
if(spaces % 4 == 0)
{
//copy b to result
}
}
所以在我们准备好之后,结果会是这样的:
Simple sentence containing one some two random words
我已经尝试过 strcpy、strcat 并且我已经为此苦苦挣扎了几天,但我似乎真的不明白这里背后的逻辑。如何进行?
最佳答案
好的,这就是我想出的。代码注释中提供了我所做的一切的详细描述。
代码:
#include <stdio.h>
#include <string.h>
#define MAX_OUTPUT_LENGTH 200
int main(int argc, char const *argv[]) {
/* You can replace the words defined below ("one" and "two") with any words
* you want to insert at the given positions.
*/
char one[] = "one";
char two[] = "two";
char sentence[] = "Longer but still simple sentence containing even more words";
char result[MAX_OUTPUT_LENGTH];
int len = strlen(sentence);
int spaces = 0;
int k = 0; //See Weather Vane's comment for why you also need the variable k
int skipUntilAnotherSpace = 0;
for(int i = 0; i < len; i++)
{
if(sentence[i] == ' ') {
spaces++;
skipUntilAnotherSpace = 0; //See my explanation below for why this is done.
}
if (k == 0) {
result[i] = sentence[i]; //Normally, we can use the variable "i" until our insertion
} else {
/* As Weather Vane's comment shows, after one insertion the positions you
* need to grab from and insert to will change. You cannot continue
* to use "i". After the first insertion:
* Sentence:
* Simple sentence containing some random words
* ^ position 27
* Current value in result variable:
* Simple sentence containing one [you want to insert here]
* ^ position 31
* So, we will need to insert into result at position k, and grab the info
* from a different variable "i".
*/
result[k] = sentence[i];
//Increment k since it will not be incremented regularly in the for loop
k++;
}
if((spaces % 3 == 0) && spaces != 0 && skipUntilAnotherSpace == 0)
{
int useVariableK = 0;
if (spaces > 3) {
/* Since spaces must already have been == 4, we have switched over
to using variable K, so we must continue to do so */
useVariableK = 1;
}
if(!useVariableK) {
result[i] = ' '; //Add a space before we add the word "one"
i++; //Increment i since we added the spaces
int j;
for (j = 0; j < strlen(one); j++) { //Add the word "one"
result[i + j] = one[j];
}
//Increment the variable i the correct # of times since we added the word "one":
i += (strlen (one));
//Add a space after the word "one":
result[i] = ' ';
k = i + 1; //Set k = to i + 1 to account for the space we just added
/* We need to revert back to where the variable "i" was before adding "one":
We used the variable i to temporarily store the positions
as we traversed across and added the word "one". Then, we
moved i back to the original position so we could access
the correct position when using sentence[i] in the next iteration.
Note that we need the +1 in the line below because we actually
need to go back one more position than nessesary; when we re-enter
the loop it will increment i to be +1 again! (sneaky)
*/
i -= (strlen (one) + 1);
/* Why we need the skipUntilAnotherSpace variable:
We cannot simply increment the "spaces" variable after this; we need
the number of spaces to conform to the number in the sentence, and
just because we have more spaces in the result, it woudn't make sense
to increment it for the sentence.
However, if we leave it the same, then the next time we will enter
this loop again since spaces == 3, and we don't want to enter this loop again;
we have done our job already!
So, we make sure not to enter the loop by setting the below variable
to 1. We do not enter the loop unless skipUntilAnotherSpace == 1.
(If we even tried to increment the spaces variable, we would actually
end up going into the next loop because spaces would = 4 ;) )
Finally, we switch back skipUntilAnotherSpace to be 0 once
another space is detected in the sentence.
*/
skipUntilAnotherSpace = 1;
} else {
//Use variable K like we do if spaces == 4:
/* Most of this loop is exactly identical to the previous one, except
that we don't need another space since it was already added before when
"one" was inserted, and we use the variable "k" instead of i. */
int j;
for (j = 0; j < strlen(one); j++) {
result[k + j] = one[j];
}
k += (strlen (one));
result[k] = ' ';
k += 1;
//spaces++;
skipUntilAnotherSpace = 1;
}
}
if((spaces % 4 == 0) && spaces != 0 && skipUntilAnotherSpace == 0)
{
/* Most of this loop is exactly identical to the previous one, except
that we don't need another space since it was already added before when
"one" was inserted, and we use the variable "k" instead of i. */
int j;
for (j = 0; j < strlen(two); j++) {
result[k + j] = two[j];
}
k += (strlen (two));
result[k] = ' ';
k += 1;
//spaces++;
skipUntilAnotherSpace = 1;
}
}
printf("%s.\n", result);
return 0;
}
注意:参见Weather Vane's评论这个问题,进一步理解为什么变量k
是必要的(我在评论中也有解释,我只是觉得Weather Vane的版本更简洁一些)。
这段代码产生的输出是:
Longer but still one simple two sentence containing one even more two words.
如果您将变量 one
和 two
更改为值 "hello" 和 "goodbye"分别地,代码仍然可以运行并产生:
Longer but still hello simple goodbye sentence containing hello even more goodbye words.
基本上,代码在变量 one[]
中每三个单词插入一个值,在变量 two[]
中每四个单词插入一个值。
希望对您有所帮助!
关于c - 每第 N 个单词插入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38338361/
我看到以下宏 here . static const char LogTable256[256] = { #define LT(n) n, n, n, n, n, n, n, n, n, n, n,
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
所以我得到了这个算法我需要计算它的时间复杂度 这样的 for i=1 to n do k=i while (k<=n) do FLIP(A[k]) k
n 的 n 次方(即 n^n)是多项式吗? T(n) = 2T(n/2) + n^n 可以用master方法求解吗? 最佳答案 它不仅不是多项式,而且比阶乘还差。 O(n^n) 支配 O(n!)。同样
我正在研究一种算法,它可以在带有变音符号的字符(tilde、circumflex、caret、umlaut、caron)及其“简单”字符之间进行映射。 例如: ń ǹ ň ñ ṅ ņ ṇ
嗯..我从昨天开始学习APL。我正在观看 YouTube 视频,从基础开始学习各种符号,我正在使用 NARS2000。 我想要的是打印斐波那契数列。我知道有好几种代码,但是因为我没有研究过高深的东西,
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭12 年前。 Improve th
谁能帮我从 N * N * N → N 中找到一个双射数学函数,它接受三个参数 x、y 和 z 并返回数字 n? 我想知道函数 f 及其反函数 f',如果我有 n,我将能够通过应用 f'(n) 来
场景: 用户可以在字符串格式的方程式中输入任意数量的括号对。但是,我需要检查以确保所有括号 ( 或 ) 都有一个相邻的乘数符号 *。因此 3( 应该是 3*( 和 )3 应该是 )*3。 我需要将所有
在 Java 中,表达式: n+++n 似乎评估为等同于: n++ + n 尽管 +n 是一个有效的一元运算符,其优先级高于 n + n 中的算术 + 运算符。因此编译器似乎假设运算符不能是一元运算符
当我阅读 this 问题我记得有人曾经告诉我(很多年前),从汇编程序的角度来看,这两个操作非常不同: n = 0; n = n - n; 这是真的吗?如果是,为什么会这样? 编辑: 正如一些回复所指出
我正在尝试在reveal.js 中加载外部markdown 文件,该文件已编写为遵守数据分隔符语法: You can write your content as a separate file and
我试图弄清楚如何使用 Javascript 生成一个随机 11 个字符串,该字符串需要特定的字母/数字序列,以及位置。 ----------------------------------------
我最近偶然发现了一个资源,其中 2T(n/2) + n/log n 类型 的递归被 MM 宣布为无法解决。 直到今天,当另一种资源被证明是矛盾的(在某种意义上)时,我才接受它作为引理。 根据资源(下面
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我完成的一个代码遵循这个模式: for (i = 0; i < N; i++){ // O(N) //do some processing... } sort(array, array + N
有没有办法证明 f(n) + g(n) = theta(n^2) 还是不可能?假设 f(n) = theta(n^2) & g(n) = O(n^2) 我尝试了以下方法:f(n) = O(n^2) &
所以我目前正在尝试计算我拥有的一些数据的 Pearson R 和 p 值。这是通过以下代码完成的: import numpy as np from scipy.stats import pearson
ltree 列的默认排序为文本。示例:我的表 id、parentid 和 wbs 中有 3 列。 ltree 列 - wbs 将 1.1.12, 1.1.1, 1.1.2 存储在不同的行中。按 wbs
我的目标是编写一个程序来计算在 python 中表示数字所需的位数,如果我选择 number = -1 或任何负数,程序不会终止,这是我的代码: number = -1 cnt = 0 while(n
我是一名优秀的程序员,十分优秀!