为什么我的程序没有读取字符串中的所有字符?

时间:2013-09-11 20:41:05

标签: c++

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

#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');
}

3 个答案:

答案 0 :(得分:1)

您的代码停止在空格处阅读,因为{strong> scanf的工作方式采用%s格式。它读取一系列非空白字符。

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

答案 1 :(得分:0)

您正在分配一个长度为60个字符的数组(str)。你不能指望阅读它很多。以下是一些提示:

  • 不要使用这种缓冲剂,它们很危险。 C ++库为您提供std::string
  • 永远不要省略花括号{}
  • 有一种更简单的方法可以检查字符,而不是这个可怕的长时间。提示:std::string::find_first_of

答案 2 :(得分:0)

这段代码很乱。

  • 根本不使用像std::string这样的C ++功能。
  • 您无缘无故地混合printf/scanfNSLog
  • 修改str分支中的if毫无意义,因为以后不会再阅读。
  • 您可能希望使用i < strlen(str)代替<=,或者您将复制该终止零字符两次。
  • 你的scanf("%s", &again);指定读取一个字符串,但你只有一个字符的内存,因此你可能最终写入一些随机的内存位置。

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