c语言分割字符串,且保持原字符串不变
时间: 2023-06-23 17:54:32 浏览: 276
在C语言中,可以使用strtok()函数分割字符串,并且不会改变原字符串。该函数将原字符串的每个分隔符替换为字符串结束符'\0',并返回分割出的子字符串的指针。
以下是一个简单的例子,展示如何使用strtok()函数分割字符串:
```c
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello,world,how,are,you";
char *token;
token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
printf("%s\n", str);
return 0;
}
```
在上面的代码中,我们将字符串"hello,world,how,are,you"传递给strtok()函数,并指定分隔符为逗号。然后,在while循环中,我们使用strtok()函数分割字符串,并将分割出的子字符串打印出来。最后,我们再次打印原字符串,可以看到原字符串并没有被修改。
相关问题
用C语言,给定一个字符串,翻转该字符串,翻转时单词中的字符顺序不变。例如,如果字符串为"Hello World",则翻转后为"World Hello"。单词间以一个或多个空格分隔。注意,字符串开头和结尾都可能有多个空格。输出时去掉多余的空格。只在每个单词之间以1个空格间隔。输出的每行末尾没有空格。
下面是用 C 语言实现的代码:
```c
#include <stdio.h>
#include <string.h>
// 翻转每个单词中的字符
void reverse(char *begin, char *end)
{
while (begin < end) {
char temp = *begin;
*begin++ = *end;
*end-- = temp;
}
}
// 翻转整个字符串
void reverseWords(char *s)
{
int len = strlen(s);
// 去除字符串两端的多余空格
int i = 0, j = len - 1;
while (i <= j && s[i] == ' ') i++;
while (i <= j && s[j] == ' ') j--;
len = j - i + 1;
s += i;
// 翻转每个单词
char *word_begin = s;
for (char *p = s; p < s + len; p++) {
if (*p == ' ') {
reverse(word_begin, p - 1);
word_begin = p + 1;
}
}
reverse(word_begin, s + len - 1);
// 翻转整个字符串
reverse(s, s + len - 1);
// 去除多余的空格
int k = 0;
for (i = 0; i < len; i++) {
if (s[i] != ' ' || (i > 0 && s[i - 1] != ' ')) {
s[k++] = s[i];
}
}
s[k] = '\0';
}
int main()
{
char s[50010];
while (fgets(s, sizeof(s), stdin) != NULL) {
reverseWords(s);
printf("%s", s);
}
return 0;
}
```
这里使用了两个辅助函数 `reverse` 和 `reverseWords` 来实现翻转操作。其中,`reverse` 函数用于翻转每个单词中的字符,`reverseWords` 函数则用于翻转整个字符串。
在 `reverseWords` 函数中,先去除字符串两端的多余空格,然后按照空格分割字符串,并翻转每个单词中的字符。接着,再次翻转整个字符串,最后去除多余的空格即可。
在 `main` 函数中,使用 `fgets` 函数逐行读入输入,调用 `reverseWords` 函数进行翻转操作,然后输出结果。
需要注意的是,在 C 语言中,字符串必须以空字符 `\0` 结尾。在对字符串进行操作时,需要保证不越界。
请用C语言编写程序,7-6 翻转单词顺序 分数 20 作者 伍建全 单位 重庆科技学院 给定一个字符串,翻转该字符串,翻转时单词中的字符顺序不变。例如,如果字符串为"Hello World",则翻转后为"World Hello"。单词间以一个或多个空格分隔。注意,字符串开头和结尾都可能有多个空格。输出时去掉多余的空格。只在每个单词之间以1个空格间隔。输出的每行末尾没有空格。 输入格式: 输入可能包括多行。每行代表一个字符串,除了空格外,标点符号和普通字母一样处理。你可以认为一行的字符总数不会超过50000个,单词数不会超过600,每个单词的长度也不会超过30。 输出格式: 输出包括多行,每行对应输入的一行,为翻转后的字符串。输出时去掉多余的空格。只在每个单词之前以1个空格间隔。输出的每行末尾没有空格。
以下是C语言代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 50010
#define MAX_WORD 610
#define MAX_WORD_LEN 31
char s[MAX_LEN]; // 输入字符串
char words[MAX_WORD][MAX_WORD_LEN]; // 存储单词
int len[MAX_WORD]; // 每个单词的长度
int main() {
while (fgets(s, MAX_LEN, stdin) != NULL) {
int n = strlen(s);
int pos = 0, word_cnt = 0;
// 分割字符串并存储单词
for (int i = 0; i < n; i++) {
if (s[i] == ' ') { // 遇到空格,分割单词
if (i > pos) { // 避免连续空格出现
strncpy(words[word_cnt], &s[pos], i - pos);
words[word_cnt][i - pos] = '\0';
len[word_cnt++] = i - pos;
}
pos = i + 1; // 更新分割位置
}
}
if (n > pos) { // 处理最后一个单词
strncpy(words[word_cnt], &s[pos], n - pos - 1);
words[word_cnt][n - pos - 1] = '\0';
len[word_cnt++] = n - pos - 1;
}
// 按单词顺序输出
for (int i = word_cnt - 1; i >= 0; i--) {
printf("%s", words[i]);
if (i > 0) printf(" "); // 单词之间只输出一个空格
}
printf("\n");
}
return 0;
}
```
使用fgets函数可以接收多行输入,每次读入一行后分割字符串并存储单词,然后按单词顺序输出即可。为了避免连续空格出现,需要在遇到空格时判断前一个位置和当前位置之间是否有字符。
阅读全文