-2

我需要输入一个字符串,如果字符串只是一个完整的字符串而不是空格,代码很好,如果输入的是一个带空格的字符串,字符串只复制第一组字符串而不是整个字符串?我是菜鸟,请帮忙。

#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] = '\0';
        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');
}
4

3 回答 3

1

您的代码在空格处停止读取,因为这就是scanf该格式的工作%s方式。它读取一系列非空白字符。

如果你真的在使用 C++,那么你最好切换到std::stringand std::getline,它将读取所有输入直到行尾。不过,您的代码似乎没有使用任何 C++ 功能,因此您可能真的在使用 C。在这种情况下,请考虑fgets改为。它也会读取整行(达到指定的大小,通常对应于缓冲区的大小)。

于 2013-09-11T21:39:21.337 回答
0

您正在分配一个 60 个字符长 (str) 的数组。你不能指望阅读很多内容。这里有一些提示:

  • 不要使用这样的缓冲区,它们很危险。C++ 库为您提供std::string
  • 永远不要省略花括号{}
  • 有一种比这个长得可怕的 if 更简单的方法来检查字符。提示:std::string::find_first_of
于 2013-09-11T20:48:40.380 回答
0

这段代码很乱。

  • std::string根本没有使用C++ 之类的功能。
  • 你在无缘无故地printf/scanf混合。NSLog
  • str在分支中修改if是没有意义的,因为它以后不会被阅读。
  • 您可能想要使用i < strlen(str)而不是<=,否则您将复制该终止零字符两次。
  • scanf("%s", &again);指定读取一个字符串,但您只有一个字符的内存,因此您最终可能会写入某个随机内存位置。

虽然其中一些点比其他点更严重,但我建议解决这些问题,看看会发生什么。如果您遇到意外的输出,请同时提供您的示例输入和输出。

于 2013-09-11T21:30:34.450 回答