如何在c中拆分char和digit

时间:2016-02-25 19:50:01

标签: c string split

输入(字符串):E2

输出:

char是E

num是2

我怎么能得到它? 感谢

我使用strtol,但它只适用于第一个char是num 如果我的输入是2E,它可以工作,但如果它是E2,那么失败。

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;


import com.squareup.picasso.Picasso;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


/**
 * A placeholder fragment containing a simple view.
 */
public class MovieListFragment extends Fragment {

    //Defining size params for the images in the gridview
    private final int IMAGE_WIDTH = 450;
    private final int IMAGE_HEIGHT = 675;

    private static String mSortOrder = "popularity.desc";

    public final static String EXTRA_MOVIE = "com.example.android.movierating.EXTRA_MOVIE";


    private final String LOG_TAG = MovieListFragment.class.getSimpleName();

    MovieAdapter mMovieAdapter;
    private LayoutInflater mInflater;

    public MovieListFragment() {
    }

    @Override
    public void onCreate(Bundle SavedInstanceState) {
        super.onCreate(SavedInstanceState);
        // We want to add options to the Menu bar.
        setHasOptionsMenu(true);
    }

    public static String getmSortOrder() {
        return mSortOrder;
    }
    public static void setmSortOrder(String sortOrder) {
        mSortOrder = sortOrder;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.movielist_fragment, menu);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mInflater = inflater;
        // We inflate and store the rootView
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        // We sotre the gridview and set a custom adapter to it. It is defined below
        GridView gridView = (GridView) getActivity().findViewById(R.id.gridview);
        mMovieAdapter = new MovieAdapter(
                getContext(),
                R.id.image_thumbnail,
                new ArrayList<Movie>()
        );
        gridView.setAdapter(mMovieAdapter);

        /* The gridView will react to a user clicking on it by creating
           an intent and populating it with the movie object. That object
           will provide the data necessary to display facts about the movie
         */
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Movie movie = mMovieAdapter.getItem(position);
                Intent detailIntent = new Intent(getActivity(), DetailActivity.class)
                        .putExtra(EXTRA_MOVIE, (Parcelable) movie);
                startActivity(detailIntent);

                }
        });
        return rootView;
    }

    public void retrieveMovies() {
        if (getmSortOrder() == "popularity.desc" || getmSortOrder() == "vote_average.desc") {
            FetchMoviesTask moviesTask = new FetchMoviesTask();
            String sortOrderArray[] = {mSortOrder};
            moviesTask.execute(sortOrderArray);
        }
    }

    @Override
    public void onStart() {
        super.onStart();
        retrieveMovies();
    }

    // Custom adapter to display Movies on a gridView
    public class MovieAdapter extends ArrayAdapter<Movie> {
        //Context member variable
        private Context mContext;
        //Constructor
        public MovieAdapter(Context context, int imgViewResourceId,
                            ArrayList<Movie> items) {
            super(context, imgViewResourceId, items);
            mContext = context;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View view = null;
            if (convertView == null) {
                view = mInflater.inflate(R.layout.fragment_main,null);
            } else {
                view = convertView;
            }
            ImageView imageView = (ImageView) view.findViewById(R.id.image_thumbnail);
            TextView textView = (TextView) view.findViewById(R.id.overlay_text);

            String url = getItem(position).getUrlPath();
            Picasso.with(mContext)
                    .load(url)
                    .resize(IMAGE_WIDTH,IMAGE_HEIGHT)
                    .centerCrop()
                    .into(imageView);

            String movieTitle = getItem(position).getOriginalTitle();
            textView.setText(movieTitle);
            textView.setBackgroundColor(getResources().getColor(R.color.translucid_black));
            textView.setTextColor(getResources().getColor(R.color.opaque_white));

            return view;
        }

    }


    // Nested class to fetch the Json information about the movies
    public class FetchMoviesTask extends AsyncTask<String, Void, List<Movie>> {

        //Log tag for debugging purposes
        private final String LOG_TAG = FetchMoviesTask.class.getSimpleName();

        // Method to take a JSON string and return a list of Movie
        // objects.
        private List<Movie> parseJSONtoArrayList(String stringJSON)
                throws JSONException{

            // String constants and the arraylist holding the results
            final String MDB_RESULTS = "results";
            final String MDB_ID = "id";
            final String MDB_PATH = "poster_path";
            final String MDB_TITLE = "original_title";
            final String MDB_SYNOPSIS = "overview";
            final String MDB_RATING = "vote_average";
            final String MDB_VOTE_COUNT = "vote_count";
            final String MDB_RELEASE = "release_date";

            List<Movie> movieArrayList = new ArrayList<>();

            // We turn the results into a JSONObject and we extract the JSONObjects
            // into an array of objects.
            JSONObject dataJSON = new JSONObject(stringJSON);
            JSONArray movieArray = dataJSON.getJSONArray(MDB_RESULTS);

            /* We iterate over the array of JSONObjects, we create a new
               Movie object and we append it to the arraylist holding the
               results.
            */
            for (int i=0; i<movieArray.length(); i++) {
                // Select a JSONObject in every iteration.
                JSONObject target = movieArray.getJSONObject(i);
                /* Create a Movie Object by retrieving the necessary elements
                   of the JSONObject
                 */
                Movie movie = new Movie(
                        target.getInt(MDB_ID),
                        createURL(target.getString(MDB_PATH)),
                        target.getString(MDB_TITLE),
                        target.getString(MDB_SYNOPSIS),
                        Float.parseFloat(target.getString(MDB_RATING)),
                        Integer.parseInt(target.getString(MDB_VOTE_COUNT)),
                        target.getString(MDB_RELEASE)
                );
                // Once we have created our object, we add it to the arrayList
                movieArrayList.add(movie);
            }
            return movieArrayList;
        }
        /* Transform a relative path provided by the API into a fully functional
           URL path.
         */
        private String createURL(String relativePath) {
            final String BASE_IMAGE_URL = "http://image.tmdb.org/t/p/";
            final String PIX_MEASURE = "w185";

            return BASE_IMAGE_URL + PIX_MEASURE + relativePath;
        }

        @Override
        protected List<Movie> doInBackground(String... params) {
            // Our default sorting parameter, request declaration,
            // reader and empty string
            String sortMethod = params[0];
            HttpURLConnection connection = null;
            BufferedReader reader = null;
            String moviesJSON = null;


            try {
                // We build the URI
                final String BASE_URL =
                        "http://api.themoviedb.org/3/discover/movie?";
                final String API_KEY = "api_key";
                final String SORT = "sort_by";

                String uri = Uri.parse(BASE_URL)
                        .buildUpon().appendQueryParameter(SORT, sortMethod)
                        .appendQueryParameter(API_KEY, getString(R.string.ApiKey))
                        .build().toString();

                URL url = new URL(uri);
                //Create the request and open the connection
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.connect();

                // Create objects to hold the results of the API call
                InputStream inputStream = connection.getInputStream();
                StringBuilder builder = new StringBuilder();

                // If we don't receive anything, we just return
                if (inputStream == null) {
                    return null;
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));

                // We write the api call results into the string builder
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line + '\n');
                }
                // We check that the result is not empty
                if (builder.length() == 0) {
                    return null;
                }

                moviesJSON = builder.toString();

            } catch (IOException e) {
                Log.e(LOG_TAG, "There was a problem fetching the movies");
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
                if (reader !=null) {
                    try {
                        reader.close();

                    } catch (IOException e) {
                        Log.e(LOG_TAG, "We found a problem while closing the reader");
                        e.printStackTrace();
                    }
                }
            }
            try {
                return parseJSONtoArrayList(moviesJSON);

            } catch (JSONException e) {
                Log.e(LOG_TAG, e.toString());
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(List<Movie> movies) {
            super.onPostExecute(movies);
            if (movies != null) {
                // Every time we call this task, we flush the Movies in the adaptor
                // And fill it up again with the results of the API call.
                mMovieAdapter.clear();
                Log.e(LOG_TAG, movies.toString());
                mMovieAdapter.addAll(movies);
            }
        }

    }
}

我想要的是如果输入E2,则ret为2且ptr为E

2 个答案:

答案 0 :(得分:2)

您可以使用sscanf

char c;
int i;
if (sscanf(input, "%c%d", &c, &i) == 2) /* make sure 2 objects were read */
    printf("The char is %c and the int is %d\n", c, i);

答案 1 :(得分:0)

这应该有效:

int main()
{
    char str[30] = "E2";
    char ptr[2];
    long ret;

    ptr[0] = str[0];
    ptr[1] = '\0';
    ret = strtol(str + 1, NULL, 10);

    printf("The number(unsigned long integer) is %ld\n", ret);
    printf("String part is %s", ptr);

    return(0);
}