基本上,我有一个由多个单词组成的字符串,例如:"Hello world test"
。
如果我尝试使用这样的结构进行打印
printf("%s", string);
或类似的
for (int i = 0; i < strlen(string); ++i) {
printf("%c", string[i];
}
我总是将其作为输出:Hello world
,并且得到的结果是11而不是16。
如果我尝试使用以前对字符串中的单个字符进行计数的int计数器打印出相同的字符串,则
for (int i = 0; i < counter; ++i) {
printf("%c", string[i];
}
我实际上得到了正确的输出Hello world test
,这导致我们相信在字符串中已正确分配了元素,但是由于某些原因,%s和strlen忽略了最后一个空格之后的元素。
为什么会这样?到底是怎么回事?我该如何解决?
编辑:
实际要求的代码:
#include <stdio.h>
#include <string.h>
typedef int BOOL;
#define TRUE 1
#define FALSE 0
int main() {
char sentence[64] = " ", reversal[64] = " ", reversal_copy[64] = " ";
int index = 0, counter = 0;
BOOL reset = TRUE, last_cycle = FALSE;
printf("Enter a sentence: ");
for (int i = 0; sentence[strlen(sentence) - 1] != '\n'; i++) {
scanf("%c", &sentence[i]);
}
/* Copies the input in a string reversing it */
for (int h = strlen(sentence) - 2, k = 0; h >= 0; h--, k++) {
reversal[k] = sentence[h];
}
/* Detects the first character of a word and the last character of the same word before a space,
switching the first char with the last, the second with the pre-last and so on*/
for (int i = 0; i < strlen(reversal); i++) {
if (reset == TRUE) {
index = i;
reset = FALSE;
}
if (i == strlen(reversal) - 1) {
last_cycle = TRUE;
counter++;
}
if (reversal[i] != ' ') {
counter++;
if (last_cycle == TRUE) {
goto reversing;
}
}
else {
reversing:
for (int h = index, z = counter; h < counter; h++, z--) {
reversal_copy[h] = reversal[z - 1];
reversal_copy[z - 1] = reversal[h];
}
if (last_cycle == FALSE) {
reversal_copy[i] = ' ';
}
reset = TRUE;
counter++;
}
}
printf("%lu ", strlen(reversal_copy));
for (int i = 0; i < counter; i++) {
printf("%c", reversal_copy[i]);
}
printf("%s\n\n", reversal_copy);
return 0;
}
答案 0 :(得分:4)
如果<script id="sap-ui-bootstrap"
src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js"
data-sap-ui-libs="sap.ui.core, sap.m"
data-sap-ui-async="true"
data-sap-ui-theme="sap_belize"
data-sap-ui-compatversion="edge"
data-sap-ui-xx-waitfortheme="true"
data-sap-ui-xx-xml-processing="sequential"
></script>
<body id="content" class="sapUiBody sapUiSizeCompact" style="height: 100%;"></body>
返回11,则在世界“世界”之后您有一个strlen()
字符。
\0
和strlen
都使用0终止符来确定“字符串是什么”,因此它们的行为相同也就不足为奇了。
答案 1 :(得分:1)
尽管没有Minimal, Complete, and Verifiable example很难回答,但我将解释您所观察到的行为的最可能原因。
带有printf
格式说明符的%s
和strlen
都给出了相关参数所指向的空终止字符串的长度。如果他们打印/报告的长度为11,但是遍历整个char数组且硬编码值为16,则输出为“ hello world test”,则world之后的字符显然是空字符'\ 0 '。
答案 2 :(得分:0)
尝试以输入“ A”为例运行您的程序-请注意,即使是一个单词也会出现问题。
当您倒换最后一个单词时,出现了问题。您正在将结尾'\0'
放在其前面。它可能与特殊的大小写以及goto
逻辑周围的last_cycle
有关,这很难遵循。
我认为这可能与您在该代码路径中有两个counter++
的事实有关。
考虑使用一些功能来使代码更简洁:
len = strlen(reversal);
for (start=0; start<len; start++) {
end = find_space_or_null(reversal, start);
if (end > start) {
reverse_chars(reversal, start, end-1);
start = end;
}
}
答案 3 :(得分:0)
该程序接受用户输入的字符串,例如“天是蓝色”,并打印出“天是蓝色”
这对strtok()
来说是完美的工作:
#include <stddef.h>
#include <stdio.h>
#include <string.h>
enum { MAX_LINE = 120 };
int main()
{
char buffer[MAX_LINE];
fgets(buffer, MAX_LINE, stdin);
size_t length = strlen(buffer);
if (length && buffer[length - 1] == '\n') // get rid of the newline
buffer[--length] = '\0';
char *tokens[MAX_LINE] = { 0 }; // there can't be more than 60 tokens, but hey
if ((tokens[0] = strtok(buffer, " ")) == NULL) // no tokens? nothing to do.
return 0;
size_t i = 1;
for (; tokens[i - 1] && i < sizeof(tokens); ++i)
tokens[i] = strtok(NULL, " "); // tokenize the buffer
--i; // the very last was NULL anyway.
while (--i) // print it reverse
printf("%s ", tokens[i]);
puts(buffer);
}
The quick brown fox jumps over the lazy dog
dog lazy the over jumps fox brown quick The