为什么我的程序没有读取字符串中的所有字符
Why is my program not reading all of characters in the string?
我需要输入一个字符串,如果字符串只是一个完整的字符串而不是空格,代码很好,如果输入是带空格的字符串,字符串只复制第一组字符串而不是整个字符串?我是菜鸟,请帮忙。
#include <stdio.h>
#include <string.h>
int main() {
char again = 0;
do {
char str[60], s[60];
int i, j = 0;
printf("Enter any string->");
scanf("%s", str);
printf("The string is->%s", str);
for (i = 0; i <= strlen(str); i++) {
if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' ||
str[i] == 'o' || str[i] == 'u' || str[i] == 'A' ||
str[i] == 'E' || str[i] == 'I' || str[i] == 'O' ||
str[i] == 'U') {
str[i] = ' ';
} else {
s[j++] = str[i];
}
}
s[j] = ' ';
printf("nThe string without vowel is->%s", s);
NSLog(@"Do you want to enter another string to be edit? (y/n) ");
scanf("%s", &again);
} while (again != 'n');
}
您的代码在空格处停止读取,因为这就是scanf
处理%s
格式的方式。它读取一系列非空格字符。
如果您真的在使用C++,那么明智的做法是切换到 std::string
和 std::getline
,这将读取行尾的所有输入。不过,您的代码似乎没有使用任何C++功能,所以也许您真的在使用 C。在这种情况下,请考虑改用fgets
。它也将读取整行(最大为指定大小,通常对应于缓冲区的大小)。
这段代码一团糟。
- 根本不使用
std::string
等C++功能。 - 你无缘无故地混合
printf/scanf
和NSLog
。 - 修改
if
分支中的str
是没有意义的,因为稍后不会读取它。 - 您可能希望使用
i < strlen(str)
而不是<=
,或者您将复制该终止零字符两次。 - 您的
scanf("%s", &again);
指定读取字符串,但您只有一个字符的内存,因此您最终可能会写入某个随机内存位置。
虽然其中一些要点比其他要点更严重,但我建议解决这些问题,看看会发生什么。如果您遇到意外的输出,那么请同时提供您的示例输入和输出。
您正在分配一个 60 个字符长 (str) 的数组。你不能指望读很多东西。以下是一些提示:
- 不要使用这样的缓冲区,它们很危险。C++库为您提供了 std::string。
- 切勿省略大括号
{}
。 - 有一种比这个可怕的长 if 更容易检查字符的方法。提示:标准::字符串::find_first_of
相关文章:
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将 NULL 与 C 的字符* 字符串一起使用
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法将常量字符字符串传递给模板类
- 如何组合一个宽字符字符串,中间插入一些空字符
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 从给定索引返回子字符字符串的函数
- 字符 [](c 字符串)的初始化标准
- 如何将字符字符串用作数学运算符
- 将 Unicode 字符/字符串写入文件
- C++,字符* 字符串修改
- 如何有效地用不同的整数元素替换字符字符串的元素
- C++:如果我们在字符串中添加一些整数,为什么它会从开头删除该数量的字符?(字符串 + 整数)
- strcpy正在复制sth字符i字符串.如何解决此错误
- 在C++中将双精度转换为字符*/字符串
- C 中的宽字符字符串
- 如何提取C 中的字符/字符串之间的字符串
- 无法将字符/字符串转换为int
- 带有指针的反转字符字符串
- 反转字符串中的 n 个字符(字符串中没有空格),而不使用 c++ 中的内置函数